broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    per_diem = rnd(x['balance'] * x['rate_bp'], 10000 * x['basis'])
    days = x['payoff_day'] - x['last_paid_day']
    interest = per_diem * days
    penalty = rnd(x['balance'] * x['penalty_bp'], 10000) if x['payoff_day'] < x['penalty_until'] else 0
    payoff = x['balance'] + interest + x['fees_due'] + penalty - x['escrow']
    return {'per_diem': per_diem, 'interest': interest, 'penalty': penalty, 'payoff': payoff}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: penalty window', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 115}, {'per_diem': 347, 'interest': 5205, 'penalty': 20000, 'payoff': 1029204}], ['regression: penalty window, partial-repair probe', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 164, 'interest': 164, 'penalty': 0, 'payoff': 1000163}], ['control 1', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 145, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 115}, {'per_diem': 17, 'interest': 765, 'penalty': 0, 'payoff': 108265}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 16, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 31}, {'per_diem': 35, 'interest': 525, 'penalty': 1000, 'payoff': 93025}], ['control 3', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 2058, 'interest': 63798, 'penalty': 0, 'payoff': 12400976}], ['control 4', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 25}, {'per_diem': 1543, 'interest': 69435, 'penalty': 0, 'payoff': 12415113}], ['control 5', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 25}, {'per_diem': 2, 'interest': 62, 'penalty': 0, 'payoff': -6938}]], [['regression: penalty window', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 2058, 'interest': 61740, 'penalty': 246914, 'payoff': 12661832}], ['regression: penalty window, partial-repair probe', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 342, 'interest': 15390, 'penalty': 0, 'payoff': 1022889}], ['control 1', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 61}, {'per_diem': 13, 'interest': 13, 'penalty': 2000, 'payoff': 105513}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 34, 'interest': 510, 'penalty': 0, 'payoff': 100510}], ['control 3', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 125, 'interest': 3750, 'penalty': 0, 'payoff': 1007249}], ['control 4', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 4228, 'interest': 4228, 'penalty': 0, 'payoff': 12337906}], ['control 5', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 12, 'interest': 12, 'penalty': 2000, 'payoff': 90012}]], [['regression: penalty window', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 31}, {'per_diem': 2058, 'interest': 61740, 'penalty': 246914, 'payoff': 12654332}], ['regression: penalty window, partial-repair probe', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 16}, {'per_diem': 1543, 'interest': 46290, 'penalty': 0, 'payoff': 12383468}], ['control 1', {'balance': 5000, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 1, 'interest': 45, 'penalty': 0, 'payoff': 9045}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 31}, {'per_diem': 35, 'interest': 1575, 'penalty': 0, 'payoff': 89575}], ['control 3', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 342, 'interest': 5130, 'penalty': 0, 'payoff': 1005129}], ['control 4', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 34, 'interest': 34, 'penalty': 0, 'payoff': 91534}], ['control 5', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 35, 'interest': 1050, 'penalty': 0, 'payoff': 108550}]], [['regression: penalty window', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 2, 'interest': 60, 'penalty': 100, 'payoff': 5160}], ['regression: penalty window, partial-repair probe', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 32, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12400360}], ['control 1', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 70}, {'per_diem': 1, 'interest': 30, 'penalty': 100, 'payoff': 8630}], ['control 2', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 16}, {'per_diem': 2, 'interest': 90, 'penalty': 0, 'payoff': -6910}], ['control 3', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 100}, {'per_diem': 1, 'interest': 30, 'penalty': 0, 'payoff': 12530}], ['control 4', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 347, 'interest': 5205, 'penalty': 20000, 'payoff': 1029204}], ['control 5', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 2, 'interest': 30, 'penalty': 50, 'payoff': -3420}]], [['regression: penalty window', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 40}, {'per_diem': 4228, 'interest': 126840, 'penalty': 123457, 'payoff': 12587475}], ['regression: penalty window, partial-repair probe', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 347, 'interest': 10757, 'penalty': 0, 'payoff': 1014256}], ['control 1', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 1543, 'interest': 23145, 'penalty': 123457, 'payoff': 12495780}], ['control 2', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 1522, 'penalty': 123457, 'payoff': 12478157}], ['control 3', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 45660, 'penalty': 0, 'payoff': 12379338}], ['control 4', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 1}, {'per_diem': 1543, 'interest': 46290, 'penalty': 0, 'payoff': 12399468}], ['control 5', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 70}, {'per_diem': 167, 'interest': 5010, 'penalty': 0, 'payoff': 1005009}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    per_diem = rnd(x['balance'] * x['rate_bp'], 10000 * x['basis'])
    days = x['payoff_day'] - x['last_paid_day']
    interest = per_diem * days
    penalty = rnd(x['balance'] * x['penalty_bp'], 10000) if x['last_paid_day'] <= x['penalty_until'] else 0
    payoff = x['balance'] + interest + x['fees_due'] + penalty - x['escrow']
    return {'per_diem': per_diem, 'interest': interest, 'penalty': penalty, 'payoff': payoff}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: penalty window', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 115}, {'per_diem': 347, 'interest': 5205, 'penalty': 20000, 'payoff': 1029204}], ['regression: penalty window, partial-repair probe', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 164, 'interest': 164, 'penalty': 0, 'payoff': 1000163}], ['control 1', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 145, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 115}, {'per_diem': 17, 'interest': 765, 'penalty': 0, 'payoff': 108265}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 16, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 31}, {'per_diem': 35, 'interest': 525, 'penalty': 1000, 'payoff': 93025}], ['control 3', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 2058, 'interest': 63798, 'penalty': 0, 'payoff': 12400976}], ['control 4', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 25}, {'per_diem': 1543, 'interest': 69435, 'penalty': 0, 'payoff': 12415113}], ['control 5', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 25}, {'per_diem': 2, 'interest': 62, 'penalty': 0, 'payoff': -6938}]], [['regression: penalty window', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 2058, 'interest': 61740, 'penalty': 246914, 'payoff': 12661832}], ['regression: penalty window, partial-repair probe', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 342, 'interest': 15390, 'penalty': 0, 'payoff': 1022889}], ['control 1', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 61}, {'per_diem': 13, 'interest': 13, 'penalty': 2000, 'payoff': 105513}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 34, 'interest': 510, 'penalty': 0, 'payoff': 100510}], ['control 3', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 125, 'interest': 3750, 'penalty': 0, 'payoff': 1007249}], ['control 4', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 4228, 'interest': 4228, 'penalty': 0, 'payoff': 12337906}], ['control 5', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 12, 'interest': 12, 'penalty': 2000, 'payoff': 90012}]], [['regression: penalty window', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 31}, {'per_diem': 2058, 'interest': 61740, 'penalty': 246914, 'payoff': 12654332}], ['regression: penalty window, partial-repair probe', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 16}, {'per_diem': 1543, 'interest': 46290, 'penalty': 0, 'payoff': 12383468}], ['control 1', {'balance': 5000, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 1, 'interest': 45, 'penalty': 0, 'payoff': 9045}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 31}, {'per_diem': 35, 'interest': 1575, 'penalty': 0, 'payoff': 89575}], ['control 3', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 342, 'interest': 5130, 'penalty': 0, 'payoff': 1005129}], ['control 4', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 34, 'interest': 34, 'penalty': 0, 'payoff': 91534}], ['control 5', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 35, 'interest': 1050, 'penalty': 0, 'payoff': 108550}]], [['regression: penalty window', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 2, 'interest': 60, 'penalty': 100, 'payoff': 5160}], ['regression: penalty window, partial-repair probe', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 32, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12400360}], ['control 1', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 70}, {'per_diem': 1, 'interest': 30, 'penalty': 100, 'payoff': 8630}], ['control 2', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 16}, {'per_diem': 2, 'interest': 90, 'penalty': 0, 'payoff': -6910}], ['control 3', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 100}, {'per_diem': 1, 'interest': 30, 'penalty': 0, 'payoff': 12530}], ['control 4', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 347, 'interest': 5205, 'penalty': 20000, 'payoff': 1029204}], ['control 5', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 2, 'interest': 30, 'penalty': 50, 'payoff': -3420}]], [['regression: penalty window', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 40}, {'per_diem': 4228, 'interest': 126840, 'penalty': 123457, 'payoff': 12587475}], ['regression: penalty window, partial-repair probe', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 347, 'interest': 10757, 'penalty': 0, 'payoff': 1014256}], ['control 1', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 1543, 'interest': 23145, 'penalty': 123457, 'payoff': 12495780}], ['control 2', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 1522, 'penalty': 123457, 'payoff': 12478157}], ['control 3', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 45660, 'penalty': 0, 'payoff': 12379338}], ['control 4', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 1}, {'per_diem': 1543, 'interest': 46290, 'penalty': 0, 'payoff': 12399468}], ['control 5', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 70}, {'per_diem': 167, 'interest': 5010, 'penalty': 0, 'payoff': 1005009}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

prompt:
Payoffs on the last day of the penalty window escape the prepayment penalty.

x = {'balance', 'rate_bp', 'last_paid_day', 'payoff_day', 'basis', 'fees_due', 'escrow' (credit, may be negative), 'penalty_bp', 'penalty_until'}. Per diem = round_half_up(balance*bp/(10000*basis)); interest = per diem * (payoff_day - last_paid_day). Penalty = round_half_up(balance*penalty_bp/10000) when payoff_day <= penalty_until, else 0. Payoff = balance + interest + fees + penalty - escrow. Return {'per_diem', 'interest', 'penalty', 'payoff'}.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    per_diem = rnd(x['balance'] * x['rate_bp'], 10000 * x['basis'])
    days = x['payoff_day'] - x['last_paid_day']
    interest = per_diem * days
    penalty = rnd(x['balance'] * x['penalty_bp'], 10000) if x['payoff_day'] <= x['penalty_until'] else 0
    payoff = x['balance'] + interest + x['fees_due'] + penalty + x['escrow']
    return {'per_diem': per_diem, 'interest': interest, 'penalty': penalty, 'payoff': payoff}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: escrow credit', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 145, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 115}, {'per_diem': 17, 'interest': 765, 'penalty': 0, 'payoff': 108265}], ['control 1', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 164, 'interest': 164, 'penalty': 0, 'payoff': 1000163}], ['control 2', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 25}, {'per_diem': 1543, 'interest': 69435, 'penalty': 0, 'payoff': 12415113}], ['control 3', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 160}, {'per_diem': 2029, 'interest': 2029, 'penalty': 246914, 'payoff': 12598121}], ['control 4', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 16, 'interest': 720, 'penalty': 0, 'payoff': 104220}], ['control 5', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 25}, {'per_diem': 1543, 'interest': 47833, 'penalty': 0, 'payoff': 12393511}], ['control 6', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 1522, 'interest': 22830, 'penalty': 123457, 'payoff': 12491965}]], [['regression: escrow credit', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 342, 'interest': 15390, 'penalty': 0, 'payoff': 1022889}], ['control 1', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 61}, {'per_diem': 13, 'interest': 13, 'penalty': 2000, 'payoff': 105513}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 34, 'interest': 510, 'penalty': 0, 'payoff': 100510}], ['control 3', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 125, 'interest': 3750, 'penalty': 0, 'payoff': 1007249}], ['control 4', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 100}, {'per_diem': 342, 'interest': 342, 'penalty': 0, 'payoff': 1000341}], ['control 5', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 70}, {'per_diem': 1, 'interest': 45, 'penalty': 50, 'payoff': 8595}], ['control 6', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 35, 'interest': 35, 'penalty': 0, 'payoff': 100035}]], [['regression: escrow credit', {'balance': 5000, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 1, 'interest': 45, 'penalty': 0, 'payoff': 9045}], ['control 1', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 342, 'interest': 5130, 'penalty': 0, 'payoff': 1005129}], ['control 2', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 31}, {'per_diem': 2058, 'interest': 61740, 'penalty': 246914, 'payoff': 12654332}], ['control 3', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 115}, {'per_diem': 2058, 'interest': 63798, 'penalty': 0, 'payoff': 12409476}], ['control 4', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 31}, {'per_diem': 35, 'interest': 1575, 'penalty': 0, 'payoff': 101575}], ['control 5', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12392860}], ['control 6', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 1543, 'interest': 47833, 'penalty': 0, 'payoff': 12393511}]], [['regression: escrow credit', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 32, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12400360}], ['control 1', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 70}, {'per_diem': 1, 'interest': 30, 'penalty': 100, 'payoff': 8630}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 34, 'interest': 1530, 'penalty': 0, 'payoff': 101530}], ['control 3', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 100}, {'per_diem': 4228, 'interest': 63420, 'penalty': 0, 'payoff': 12412598}], ['control 4', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 160}, {'per_diem': 13, 'interest': 195, 'penalty': 0, 'payoff': 100195}], ['control 5', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 12, 'interest': 12, 'penalty': 2000, 'payoff': 105512}], ['control 6', {'balance': 5000, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 16}, {'per_diem': 1, 'interest': 30, 'penalty': 0, 'payoff': 5030}]], [['regression: escrow credit', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 1522, 'penalty': 123457, 'payoff': 12478157}], ['control 1', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 347, 'interest': 10757, 'penalty': 0, 'payoff': 1014256}], ['control 2', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 1543, 'interest': 23145, 'penalty': 123457, 'payoff': 12495780}], ['control 3', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 70}, {'per_diem': 167, 'interest': 5010, 'penalty': 0, 'payoff': 1005009}], ['control 4', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 2029, 'interest': 30435, 'penalty': 246914, 'payoff': 12623027}], ['control 5', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12396360}], ['control 6', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 32, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 164, 'interest': 5084, 'penalty': 0, 'payoff': 1005083}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

meaning: Fixture-count band, not measured model difficulty

deps: stdlib

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    per_diem = rnd(x['balance'] * x['rate_bp'], 10000 * x['basis'])
    days = x['payoff_day'] - x['last_paid_day']
    interest = per_diem * days
    penalty = rnd(x['balance'] * x['penalty_bp'], 10000) if x['payoff_day'] <= x['penalty_until'] else 0
    payoff = x['balance'] + interest + x['fees_due'] + penalty - max(x['escrow'], 0)
    return {'per_diem': per_diem, 'interest': interest, 'penalty': penalty, 'payoff': payoff}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: escrow credit', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 145, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 115}, {'per_diem': 17, 'interest': 765, 'penalty': 0, 'payoff': 108265}], ['control 1', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 164, 'interest': 164, 'penalty': 0, 'payoff': 1000163}], ['control 2', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 25}, {'per_diem': 1543, 'interest': 69435, 'penalty': 0, 'payoff': 12415113}], ['control 3', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 160}, {'per_diem': 2029, 'interest': 2029, 'penalty': 246914, 'payoff': 12598121}], ['control 4', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 16, 'interest': 720, 'penalty': 0, 'payoff': 104220}], ['control 5', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 25}, {'per_diem': 1543, 'interest': 47833, 'penalty': 0, 'payoff': 12393511}], ['control 6', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 1522, 'interest': 22830, 'penalty': 123457, 'payoff': 12491965}]], [['regression: escrow credit', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 342, 'interest': 15390, 'penalty': 0, 'payoff': 1022889}], ['control 1', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 61}, {'per_diem': 13, 'interest': 13, 'penalty': 2000, 'payoff': 105513}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 34, 'interest': 510, 'penalty': 0, 'payoff': 100510}], ['control 3', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 125, 'interest': 3750, 'penalty': 0, 'payoff': 1007249}], ['control 4', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 100}, {'per_diem': 342, 'interest': 342, 'penalty': 0, 'payoff': 1000341}], ['control 5', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 70}, {'per_diem': 1, 'interest': 45, 'penalty': 50, 'payoff': 8595}], ['control 6', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 35, 'interest': 35, 'penalty': 0, 'payoff': 100035}]], [['regression: escrow credit', {'balance': 5000, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 1, 'interest': 45, 'penalty': 0, 'payoff': 9045}], ['control 1', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 342, 'interest': 5130, 'penalty': 0, 'payoff': 1005129}], ['control 2', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 31}, {'per_diem': 2058, 'interest': 61740, 'penalty': 246914, 'payoff': 12654332}], ['control 3', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 115}, {'per_diem': 2058, 'interest': 63798, 'penalty': 0, 'payoff': 12409476}], ['control 4', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 31}, {'per_diem': 35, 'interest': 1575, 'penalty': 0, 'payoff': 101575}], ['control 5', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12392860}], ['control 6', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 1543, 'interest': 47833, 'penalty': 0, 'payoff': 12393511}]], [['regression: escrow credit', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 32, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12400360}], ['control 1', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 70}, {'per_diem': 1, 'interest': 30, 'penalty': 100, 'payoff': 8630}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 34, 'interest': 1530, 'penalty': 0, 'payoff': 101530}], ['control 3', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 100}, {'per_diem': 4228, 'interest': 63420, 'penalty': 0, 'payoff': 12412598}], ['control 4', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 160}, {'per_diem': 13, 'interest': 195, 'penalty': 0, 'payoff': 100195}], ['control 5', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 12, 'interest': 12, 'penalty': 2000, 'payoff': 105512}], ['control 6', {'balance': 5000, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 16}, {'per_diem': 1, 'interest': 30, 'penalty': 0, 'payoff': 5030}]], [['regression: escrow credit', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 1522, 'penalty': 123457, 'payoff': 12478157}], ['control 1', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 347, 'interest': 10757, 'penalty': 0, 'payoff': 1014256}], ['control 2', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 1543, 'interest': 23145, 'penalty': 123457, 'payoff': 12495780}], ['control 3', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 70}, {'per_diem': 167, 'interest': 5010, 'penalty': 0, 'payoff': 1005009}], ['control 4', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 2029, 'interest': 30435, 'penalty': 246914, 'payoff': 12623027}], ['control 5', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12396360}], ['control 6', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 32, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 164, 'interest': 5084, 'penalty': 0, 'payoff': 1005083}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

prompt:
Escrow balances increase the payoff amount.

x = {'balance', 'rate_bp', 'last_paid_day', 'payoff_day', 'basis', 'fees_due', 'escrow' (credit, may be negative), 'penalty_bp', 'penalty_until'}. Per diem = round_half_up(balance*bp/(10000*basis)); interest = per diem * (payoff_day - last_paid_day). Penalty = round_half_up(balance*penalty_bp/10000) when payoff_day <= penalty_until, else 0. Payoff = balance + interest + fees + penalty - escrow. Return {'per_diem', 'interest', 'penalty', 'payoff'}.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    per_diem = rnd(x['balance'] * x['rate_bp'], 10000 * x['basis'])
    days = x['payoff_day'] - x['last_paid_day']
    interest = per_diem * days
    penalty = rnd((x['balance'] + interest) * x['penalty_bp'], 10000) if x['payoff_day'] <= x['penalty_until'] else 0
    payoff = x['balance'] + interest + x['fees_due'] + penalty - x['escrow']
    return {'per_diem': per_diem, 'interest': interest, 'penalty': penalty, 'payoff': payoff}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: penalty base', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 16, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 31}, {'per_diem': 35, 'interest': 525, 'penalty': 1000, 'payoff': 93025}], ['control 1', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 145, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 115}, {'per_diem': 17, 'interest': 765, 'penalty': 0, 'payoff': 108265}], ['control 2', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 164, 'interest': 164, 'penalty': 0, 'payoff': 1000163}], ['control 3', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 2058, 'interest': 63798, 'penalty': 0, 'payoff': 12400976}], ['control 4', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 25}, {'per_diem': 1543, 'interest': 69435, 'penalty': 0, 'payoff': 12415113}], ['control 5', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 25}, {'per_diem': 2, 'interest': 62, 'penalty': 0, 'payoff': -6938}], ['control 6', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 1}, {'per_diem': 16, 'interest': 720, 'penalty': 0, 'payoff': 88720}]], [['regression: penalty base', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 1522, 'interest': 1522, 'penalty': 246914, 'payoff': 12598114}], ['control 1', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 342, 'interest': 15390, 'penalty': 0, 'payoff': 1022889}], ['control 2', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 61}, {'per_diem': 13, 'interest': 13, 'penalty': 2000, 'payoff': 105513}], ['control 3', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 34, 'interest': 510, 'penalty': 0, 'payoff': 100510}], ['control 4', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 125, 'interest': 3750, 'penalty': 0, 'payoff': 1007249}], ['control 5', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 4228, 'interest': 4228, 'penalty': 0, 'payoff': 12337906}], ['control 6', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 12, 'interest': 12, 'penalty': 2000, 'payoff': 90012}]], [['regression: penalty base', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 31}, {'per_diem': 2058, 'interest': 61740, 'penalty': 246914, 'payoff': 12654332}], ['control 1', {'balance': 5000, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 1, 'interest': 45, 'penalty': 0, 'payoff': 9045}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 31}, {'per_diem': 35, 'interest': 1575, 'penalty': 0, 'payoff': 89575}], ['control 3', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 342, 'interest': 5130, 'penalty': 0, 'payoff': 1005129}], ['control 4', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 16}, {'per_diem': 1543, 'interest': 46290, 'penalty': 0, 'payoff': 12383468}], ['control 5', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 34, 'interest': 34, 'penalty': 0, 'payoff': 91534}], ['control 6', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 35, 'interest': 1050, 'penalty': 0, 'payoff': 108550}]], [['regression: penalty base', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 70}, {'per_diem': 1, 'interest': 30, 'penalty': 100, 'payoff': 8630}], ['control 1', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 32, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12400360}], ['control 2', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 16}, {'per_diem': 2, 'interest': 90, 'penalty': 0, 'payoff': -6910}], ['control 3', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 100}, {'per_diem': 1, 'interest': 30, 'penalty': 0, 'payoff': 12530}], ['control 4', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 2, 'interest': 30, 'penalty': 50, 'payoff': -3420}], ['control 5', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 34, 'interest': 1530, 'penalty': 0, 'payoff': 101530}], ['control 6', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 100}, {'per_diem': 4228, 'interest': 63420, 'penalty': 0, 'payoff': 12412598}]], [['regression: penalty base', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 1543, 'interest': 23145, 'penalty': 123457, 'payoff': 12495780}], ['control 1', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 347, 'interest': 10757, 'penalty': 0, 'payoff': 1014256}], ['control 2', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 45660, 'penalty': 0, 'payoff': 12379338}], ['control 3', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 1}, {'per_diem': 1543, 'interest': 46290, 'penalty': 0, 'payoff': 12399468}], ['control 4', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 70}, {'per_diem': 167, 'interest': 5010, 'penalty': 0, 'payoff': 1005009}], ['control 5', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 16}, {'per_diem': 125, 'interest': 3750, 'penalty': 0, 'payoff': 1007749}], ['control 6', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 25}, {'per_diem': 123, 'interest': 123, 'penalty': 0, 'payoff': 991622}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    per_diem = rnd(x['balance'] * x['rate_bp'], 10000 * x['basis'])
    days = x['payoff_day'] - x['last_paid_day']
    interest = per_diem * days
    penalty = rnd(x['balance'] * x['penalty_bp'], 120000) if x['payoff_day'] <= x['penalty_until'] else 0
    payoff = x['balance'] + interest + x['fees_due'] + penalty - x['escrow']
    return {'per_diem': per_diem, 'interest': interest, 'penalty': penalty, 'payoff': payoff}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: penalty base', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 16, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 31}, {'per_diem': 35, 'interest': 525, 'penalty': 1000, 'payoff': 93025}], ['control 1', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 145, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 115}, {'per_diem': 17, 'interest': 765, 'penalty': 0, 'payoff': 108265}], ['control 2', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 164, 'interest': 164, 'penalty': 0, 'payoff': 1000163}], ['control 3', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 2058, 'interest': 63798, 'penalty': 0, 'payoff': 12400976}], ['control 4', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 25}, {'per_diem': 1543, 'interest': 69435, 'penalty': 0, 'payoff': 12415113}], ['control 5', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 41, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 25}, {'per_diem': 2, 'interest': 62, 'penalty': 0, 'payoff': -6938}], ['control 6', {'balance': 100000, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 1}, {'per_diem': 16, 'interest': 720, 'penalty': 0, 'payoff': 88720}]], [['regression: penalty base', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 40}, {'per_diem': 1522, 'interest': 1522, 'penalty': 246914, 'payoff': 12598114}], ['control 1', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 342, 'interest': 15390, 'penalty': 0, 'payoff': 1022889}], ['control 2', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 61}, {'per_diem': 13, 'interest': 13, 'penalty': 2000, 'payoff': 105513}], ['control 3', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 10}, {'per_diem': 34, 'interest': 510, 'penalty': 0, 'payoff': 100510}], ['control 4', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 125, 'interest': 3750, 'penalty': 0, 'payoff': 1007249}], ['control 5', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 4228, 'interest': 4228, 'penalty': 0, 'payoff': 12337906}], ['control 6', {'balance': 100000, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 101, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 200, 'penalty_until': 130}, {'per_diem': 12, 'interest': 12, 'penalty': 2000, 'payoff': 90012}]], [['regression: penalty base', {'balance': 12345678, 'rate_bp': 600, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 31}, {'per_diem': 2058, 'interest': 61740, 'penalty': 246914, 'payoff': 12654332}], ['control 1', {'balance': 5000, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 55, 'basis': 365, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 1, 'interest': 45, 'penalty': 0, 'payoff': 9045}], ['control 2', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 31}, {'per_diem': 35, 'interest': 1575, 'penalty': 0, 'payoff': 89575}], ['control 3', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 10, 'payoff_day': 25, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 40}, {'per_diem': 342, 'interest': 5130, 'penalty': 0, 'payoff': 1005129}], ['control 4', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 16}, {'per_diem': 1543, 'interest': 46290, 'penalty': 0, 'payoff': 12383468}], ['control 5', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 2, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 34, 'interest': 34, 'penalty': 0, 'payoff': 91534}], ['control 6', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 35, 'interest': 1050, 'penalty': 0, 'payoff': 108550}]], [['regression: penalty base', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 70}, {'per_diem': 1, 'interest': 30, 'penalty': 100, 'payoff': 8630}], ['control 1', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 32, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 100, 'penalty_until': 1}, {'per_diem': 1522, 'interest': 47182, 'penalty': 0, 'payoff': 12400360}], ['control 2', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 360, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 16}, {'per_diem': 2, 'interest': 90, 'penalty': 0, 'payoff': -6910}], ['control 3', {'balance': 5000, 'rate_bp': 600, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 365, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 100}, {'per_diem': 1, 'interest': 30, 'penalty': 0, 'payoff': 12530}], ['control 4', {'balance': 5000, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 2, 'interest': 30, 'penalty': 50, 'payoff': -3420}], ['control 5', {'balance': 100000, 'rate_bp': 1250, 'last_paid_day': 1, 'payoff_day': 46, 'basis': 365, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 61}, {'per_diem': 34, 'interest': 1530, 'penalty': 0, 'payoff': 101530}], ['control 6', {'balance': 12345678, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 365, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 200, 'penalty_until': 100}, {'per_diem': 4228, 'interest': 63420, 'penalty': 0, 'payoff': 12412598}]], [['regression: penalty base', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 115, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 160}, {'per_diem': 1543, 'interest': 23145, 'penalty': 123457, 'payoff': 12495780}], ['control 1', {'balance': 999999, 'rate_bp': 1250, 'last_paid_day': 100, 'payoff_day': 131, 'basis': 360, 'fees_due': 3500, 'escrow': 0, 'penalty_bp': 100, 'penalty_until': 115}, {'per_diem': 347, 'interest': 10757, 'penalty': 0, 'payoff': 1014256}], ['control 2', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 100, 'payoff_day': 130, 'basis': 365, 'fees_due': 0, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 130}, {'per_diem': 1522, 'interest': 45660, 'penalty': 0, 'payoff': 12379338}], ['control 3', {'balance': 12345678, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 3500, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 1}, {'per_diem': 1543, 'interest': 46290, 'penalty': 0, 'payoff': 12399468}], ['control 4', {'balance': 999999, 'rate_bp': 600, 'last_paid_day': 10, 'payoff_day': 40, 'basis': 360, 'fees_due': 0, 'escrow': 0, 'penalty_bp': 0, 'penalty_until': 70}, {'per_diem': 167, 'interest': 5010, 'penalty': 0, 'payoff': 1005009}], ['control 5', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 1, 'payoff_day': 31, 'basis': 360, 'fees_due': 0, 'escrow': -4000, 'penalty_bp': 200, 'penalty_until': 16}, {'per_diem': 125, 'interest': 3750, 'penalty': 0, 'payoff': 1007749}], ['control 6', {'balance': 999999, 'rate_bp': 450, 'last_paid_day': 10, 'payoff_day': 11, 'basis': 365, 'fees_due': 3500, 'escrow': 12000, 'penalty_bp': 0, 'penalty_until': 25}, {'per_diem': 123, 'interest': 123, 'penalty': 0, 'payoff': 991622}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

prompt:
The prepayment penalty is charged on accrued interest as well as principal.

x = {'balance', 'rate_bp', 'last_paid_day', 'payoff_day', 'basis', 'fees_due', 'escrow' (credit, may be negative), 'penalty_bp', 'penalty_until'}. Per diem = round_half_up(balance*bp/(10000*basis)); interest = per diem * (payoff_day - last_paid_day). Penalty = round_half_up(balance*penalty_bp/10000) when payoff_day <= penalty_until, else 0. Payoff = balance + interest + fees + penalty - escrow. Return {'per_diem', 'interest', 'penalty', 'payoff'}.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    total = sum(x['disbursements'])
    base = rnd(total, 12)
    cushion = base * x['cushion_months']
    diff = x['low_point'] - cushion
    shortage = max(0, -diff)
    surplus = max(0, diff)
    refund = surplus if surplus >= x['refund_threshold'] else 0
    monthly = base + (shortage + 11) // 12 - (0 if refund else surplus // 12)
    return {'base': base, 'cushion': cushion, 'shortage': shortage, 'refund': refund, 'monthly': monthly}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: cushion computation', {'disbursements': [120000, 36000, 99999], 'low_point': -5000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 21333, 'cushion': 42667, 'shortage': 47667, 'refund': 0, 'monthly': 25306}], ['regression: cushion computation, partial-repair probe', {'disbursements': [36000, 250000], 'low_point': -5000, 'cushion_months': 5, 'refund_threshold': 5000}, {'base': 23833, 'cushion': 119167, 'shortage': 124167, 'refund': 0, 'monthly': 34181}], ['control 1', {'disbursements': [99999, 250000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 29167, 'cushion': 29167, 'shortage': 0, 'refund': 50833, 'monthly': 29167}], ['control 2', {'disbursements': [120000], 'low_point': 0, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 10000, 'shortage': 10000, 'refund': 0, 'monthly': 10834}], ['control 3', {'disbursements': [99999, 250000, 7], 'low_point': -5000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 29167, 'cushion': 29167, 'shortage': 34167, 'refund': 0, 'monthly': 32015}], ['control 4', {'disbursements': [36000, 36000, 120000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 16000, 'cushion': 32000, 'shortage': 0, 'refund': 118000, 'monthly': 16000}], ['control 5', {'disbursements': [99999, 99999], 'low_point': 10000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 16667, 'cushion': 16667, 'shortage': 6667, 'refund': 0, 'monthly': 17223}]], [['regression: cushion computation', {'disbursements': [250000, 99999, 120000], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 195833, 'shortage': 45833, 'refund': 0, 'monthly': 42987}], ['control 1', {'disbursements': [120000, 36000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 13000, 'cushion': 13000, 'shortage': 0, 'refund': 67000, 'monthly': 13000}], ['control 2', {'disbursements': [36000], 'low_point': 10000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 3000, 'cushion': 6000, 'shortage': 0, 'refund': 0, 'monthly': 2667}], ['control 3', {'disbursements': [7, 36000], 'low_point': 0, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 3001, 'cushion': 0, 'shortage': 0, 'refund': 0, 'monthly': 3001}], ['control 4', {'disbursements': [120000, 120000], 'low_point': 40000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 20000, 'cushion': 40000, 'shortage': 0, 'refund': 0, 'monthly': 20000}], ['control 5', {'disbursements': [250000, 120000, 99999], 'low_point': -5000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 39167, 'shortage': 44167, 'refund': 0, 'monthly': 42848}], ['control 6', {'disbursements': [120000], 'low_point': 150000, 'cushion_months': 1, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 10000, 'shortage': 0, 'refund': 140000, 'monthly': 10000}]], [['regression: cushion computation', {'disbursements': [120000, 120000, 7], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 5000}, {'base': 20001, 'cushion': 100003, 'shortage': 20003, 'refund': 0, 'monthly': 21668}], ['control 1', {'disbursements': [250000, 120000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 30833, 'cushion': 30833, 'shortage': 0, 'refund': 49167, 'monthly': 30833}], ['control 2', {'disbursements': [36000], 'low_point': 0, 'cushion_months': 5, 'refund_threshold': 5000}, {'base': 3000, 'cushion': 15000, 'shortage': 15000, 'refund': 0, 'monthly': 4250}], ['control 3', {'disbursements': [7, 250000], 'low_point': 80000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 20834, 'cushion': 0, 'shortage': 0, 'refund': 80000, 'monthly': 20834}], ['control 4', {'disbursements': [7, 36000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 3001, 'cushion': 3001, 'shortage': 0, 'refund': 76999, 'monthly': 3001}], ['control 5', {'disbursements': [120000, 36000], 'low_point': 0, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 13000, 'cushion': 13000, 'shortage': 13000, 'refund': 0, 'monthly': 14084}], ['control 6', {'disbursements': [120000], 'low_point': 40000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 20000, 'shortage': 0, 'refund': 20000, 'monthly': 10000}]], [['regression: cushion computation', {'disbursements': [36000, 7], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 0}, {'base': 3001, 'cushion': 15003, 'shortage': 0, 'refund': 134997, 'monthly': 3001}], ['control 1', {'disbursements': [36000], 'low_point': -5000, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 3000, 'cushion': 0, 'shortage': 5000, 'refund': 0, 'monthly': 3417}], ['control 2', {'disbursements': [99999, 36000], 'low_point': 150000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 11333, 'cushion': 11333, 'shortage': 0, 'refund': 138667, 'monthly': 11333}], ['control 3', {'disbursements': [120000, 250000, 99999], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 39167, 'shortage': 0, 'refund': 40833, 'monthly': 39167}], ['control 4', {'disbursements': [36000, 7, 250000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 23834, 'cushion': 47668, 'shortage': 0, 'refund': 102332, 'monthly': 23834}], ['control 5', {'disbursements': [36000], 'low_point': 10000, 'cushion_months': 2, 'refund_threshold': 0}, {'base': 3000, 'cushion': 6000, 'shortage': 0, 'refund': 4000, 'monthly': 3000}], ['control 6', {'disbursements': [36000], 'low_point': 0, 'cushion_months': 2, 'refund_threshold': 0}, {'base': 3000, 'cushion': 6000, 'shortage': 6000, 'refund': 0, 'monthly': 3500}]], [['regression: cushion computation', {'disbursements': [7], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 1, 'cushion': 3, 'shortage': 0, 'refund': 79997, 'monthly': 1}], ['control 1', {'disbursements': [120000], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 50000, 'shortage': 0, 'refund': 100000, 'monthly': 10000}], ['control 2', {'disbursements': [99999], 'low_point': -5000, 'cushion_months': 0, 'refund_threshold': 20000}, {'base': 8333, 'cushion': 0, 'shortage': 5000, 'refund': 0, 'monthly': 8750}], ['control 3', {'disbursements': [7, 99999, 36000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 11334, 'cushion': 22668, 'shortage': 0, 'refund': 127332, 'monthly': 11334}], ['control 4', {'disbursements': [120000], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 50000, 'shortage': 0, 'refund': 30000, 'monthly': 10000}], ['control 5', {'disbursements': [120000, 36000, 99999], 'low_point': 40000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 21333, 'cushion': 0, 'shortage': 0, 'refund': 40000, 'monthly': 21333}], ['control 6', {'disbursements': [36000, 99999], 'low_point': 40000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 11333, 'cushion': 11333, 'shortage': 0, 'refund': 28667, 'monthly': 11333}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    total = sum(x['disbursements'])
    base = rnd(total, 12)
    cushion = rnd(total, 12 // x['cushion_months']) if x['cushion_months'] else 0
    diff = x['low_point'] - cushion
    shortage = max(0, -diff)
    surplus = max(0, diff)
    refund = surplus if surplus >= x['refund_threshold'] else 0
    monthly = base + (shortage + 11) // 12 - (0 if refund else surplus // 12)
    return {'base': base, 'cushion': cushion, 'shortage': shortage, 'refund': refund, 'monthly': monthly}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: cushion computation', {'disbursements': [120000, 36000, 99999], 'low_point': -5000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 21333, 'cushion': 42667, 'shortage': 47667, 'refund': 0, 'monthly': 25306}], ['regression: cushion computation, partial-repair probe', {'disbursements': [36000, 250000], 'low_point': -5000, 'cushion_months': 5, 'refund_threshold': 5000}, {'base': 23833, 'cushion': 119167, 'shortage': 124167, 'refund': 0, 'monthly': 34181}], ['control 1', {'disbursements': [99999, 250000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 29167, 'cushion': 29167, 'shortage': 0, 'refund': 50833, 'monthly': 29167}], ['control 2', {'disbursements': [120000], 'low_point': 0, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 10000, 'shortage': 10000, 'refund': 0, 'monthly': 10834}], ['control 3', {'disbursements': [99999, 250000, 7], 'low_point': -5000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 29167, 'cushion': 29167, 'shortage': 34167, 'refund': 0, 'monthly': 32015}], ['control 4', {'disbursements': [36000, 36000, 120000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 16000, 'cushion': 32000, 'shortage': 0, 'refund': 118000, 'monthly': 16000}], ['control 5', {'disbursements': [99999, 99999], 'low_point': 10000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 16667, 'cushion': 16667, 'shortage': 6667, 'refund': 0, 'monthly': 17223}]], [['regression: cushion computation', {'disbursements': [250000, 99999, 120000], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 195833, 'shortage': 45833, 'refund': 0, 'monthly': 42987}], ['control 1', {'disbursements': [120000, 36000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 13000, 'cushion': 13000, 'shortage': 0, 'refund': 67000, 'monthly': 13000}], ['control 2', {'disbursements': [36000], 'low_point': 10000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 3000, 'cushion': 6000, 'shortage': 0, 'refund': 0, 'monthly': 2667}], ['control 3', {'disbursements': [7, 36000], 'low_point': 0, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 3001, 'cushion': 0, 'shortage': 0, 'refund': 0, 'monthly': 3001}], ['control 4', {'disbursements': [120000, 120000], 'low_point': 40000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 20000, 'cushion': 40000, 'shortage': 0, 'refund': 0, 'monthly': 20000}], ['control 5', {'disbursements': [250000, 120000, 99999], 'low_point': -5000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 39167, 'shortage': 44167, 'refund': 0, 'monthly': 42848}], ['control 6', {'disbursements': [120000], 'low_point': 150000, 'cushion_months': 1, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 10000, 'shortage': 0, 'refund': 140000, 'monthly': 10000}]], [['regression: cushion computation', {'disbursements': [120000, 120000, 7], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 5000}, {'base': 20001, 'cushion': 100003, 'shortage': 20003, 'refund': 0, 'monthly': 21668}], ['control 1', {'disbursements': [250000, 120000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 30833, 'cushion': 30833, 'shortage': 0, 'refund': 49167, 'monthly': 30833}], ['control 2', {'disbursements': [36000], 'low_point': 0, 'cushion_months': 5, 'refund_threshold': 5000}, {'base': 3000, 'cushion': 15000, 'shortage': 15000, 'refund': 0, 'monthly': 4250}], ['control 3', {'disbursements': [7, 250000], 'low_point': 80000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 20834, 'cushion': 0, 'shortage': 0, 'refund': 80000, 'monthly': 20834}], ['control 4', {'disbursements': [7, 36000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 3001, 'cushion': 3001, 'shortage': 0, 'refund': 76999, 'monthly': 3001}], ['control 5', {'disbursements': [120000, 36000], 'low_point': 0, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 13000, 'cushion': 13000, 'shortage': 13000, 'refund': 0, 'monthly': 14084}], ['control 6', {'disbursements': [120000], 'low_point': 40000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 20000, 'shortage': 0, 'refund': 20000, 'monthly': 10000}]], [['regression: cushion computation', {'disbursements': [36000, 7], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 0}, {'base': 3001, 'cushion': 15003, 'shortage': 0, 'refund': 134997, 'monthly': 3001}], ['control 1', {'disbursements': [36000], 'low_point': -5000, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 3000, 'cushion': 0, 'shortage': 5000, 'refund': 0, 'monthly': 3417}], ['control 2', {'disbursements': [99999, 36000], 'low_point': 150000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 11333, 'cushion': 11333, 'shortage': 0, 'refund': 138667, 'monthly': 11333}], ['control 3', {'disbursements': [120000, 250000, 99999], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 39167, 'shortage': 0, 'refund': 40833, 'monthly': 39167}], ['control 4', {'disbursements': [36000, 7, 250000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 23834, 'cushion': 47668, 'shortage': 0, 'refund': 102332, 'monthly': 23834}], ['control 5', {'disbursements': [36000], 'low_point': 10000, 'cushion_months': 2, 'refund_threshold': 0}, {'base': 3000, 'cushion': 6000, 'shortage': 0, 'refund': 4000, 'monthly': 3000}], ['control 6', {'disbursements': [36000], 'low_point': 0, 'cushion_months': 2, 'refund_threshold': 0}, {'base': 3000, 'cushion': 6000, 'shortage': 6000, 'refund': 0, 'monthly': 3500}]], [['regression: cushion computation', {'disbursements': [7], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 1, 'cushion': 3, 'shortage': 0, 'refund': 79997, 'monthly': 1}], ['control 1', {'disbursements': [120000], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 50000, 'shortage': 0, 'refund': 100000, 'monthly': 10000}], ['control 2', {'disbursements': [99999], 'low_point': -5000, 'cushion_months': 0, 'refund_threshold': 20000}, {'base': 8333, 'cushion': 0, 'shortage': 5000, 'refund': 0, 'monthly': 8750}], ['control 3', {'disbursements': [7, 99999, 36000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 11334, 'cushion': 22668, 'shortage': 0, 'refund': 127332, 'monthly': 11334}], ['control 4', {'disbursements': [120000], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 50000, 'shortage': 0, 'refund': 30000, 'monthly': 10000}], ['control 5', {'disbursements': [120000, 36000, 99999], 'low_point': 40000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 21333, 'cushion': 0, 'shortage': 0, 'refund': 40000, 'monthly': 21333}], ['control 6', {'disbursements': [36000, 99999], 'low_point': 40000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 11333, 'cushion': 11333, 'shortage': 0, 'refund': 28667, 'monthly': 11333}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

prompt:
Cushions drift by a few cents from the annual formula.

x = {'disbursements': annual amounts, 'low_point': projected lowest balance, 'cushion_months', 'refund_threshold'}. total = sum; base = round_half_up(total/12); cushion = round_half_up(total*cushion_months/12); diff = low_point - cushion; shortage = max(0, -diff) is collected over 12 months rounded up; surplus = max(0, diff) is refunded when >= refund_threshold, otherwise floor(surplus/12) is credited monthly. Return {'base', 'cushion', 'shortage', 'refund', 'monthly'}.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    total = sum(x['disbursements'])
    base = rnd(total, 12)
    cushion = rnd(total * x['cushion_months'], 12)
    diff = x['low_point'] - cushion
    shortage = max(0, -diff)
    surplus = max(0, diff)
    refund = surplus if surplus >= x['refund_threshold'] else 0
    monthly = base + shortage // 12 - (0 if refund else surplus // 12)
    return {'base': base, 'cushion': cushion, 'shortage': shortage, 'refund': refund, 'monthly': monthly}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: shortage spread rounding', {'disbursements': [120000, 36000, 99999], 'low_point': -5000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 21333, 'cushion': 42667, 'shortage': 47667, 'refund': 0, 'monthly': 25306}], ['control 1', {'disbursements': [99999, 250000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 29167, 'cushion': 29167, 'shortage': 0, 'refund': 50833, 'monthly': 29167}], ['control 2', {'disbursements': [36000, 36000, 120000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 16000, 'cushion': 32000, 'shortage': 0, 'refund': 118000, 'monthly': 16000}], ['control 3', {'disbursements': [99999, 7], 'low_point': 80000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 8334, 'cushion': 16668, 'shortage': 0, 'refund': 63332, 'monthly': 8334}], ['control 4', {'disbursements': [120000], 'low_point': 40000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 0, 'shortage': 0, 'refund': 40000, 'monthly': 10000}], ['control 5', {'disbursements': [250000, 250000, 250000], 'low_point': 150000, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 62500, 'cushion': 0, 'shortage': 0, 'refund': 150000, 'monthly': 62500}], ['control 6', {'disbursements': [99999], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 8333, 'cushion': 41666, 'shortage': 0, 'refund': 38334, 'monthly': 8333}]], [['regression: shortage spread rounding', {'disbursements': [250000, 99999, 120000], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 195833, 'shortage': 45833, 'refund': 0, 'monthly': 42987}], ['control 1', {'disbursements': [120000, 36000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 13000, 'cushion': 13000, 'shortage': 0, 'refund': 67000, 'monthly': 13000}], ['control 2', {'disbursements': [36000], 'low_point': 10000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 3000, 'cushion': 6000, 'shortage': 0, 'refund': 0, 'monthly': 2667}], ['control 3', {'disbursements': [7, 36000], 'low_point': 0, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 3001, 'cushion': 0, 'shortage': 0, 'refund': 0, 'monthly': 3001}], ['control 4', {'disbursements': [120000, 120000], 'low_point': 40000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 20000, 'cushion': 40000, 'shortage': 0, 'refund': 0, 'monthly': 20000}], ['control 5', {'disbursements': [120000], 'low_point': 150000, 'cushion_months': 1, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 10000, 'shortage': 0, 'refund': 140000, 'monthly': 10000}], ['control 6', {'disbursements': [7, 99999, 36000], 'low_point': 80000, 'cushion_months': 0, 'refund_threshold': 20000}, {'base': 11334, 'cushion': 0, 'shortage': 0, 'refund': 80000, 'monthly': 11334}]], [['regression: shortage spread rounding', {'disbursements': [120000, 36000], 'low_point': 0, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 13000, 'cushion': 13000, 'shortage': 13000, 'refund': 0, 'monthly': 14084}], ['control 1', {'disbursements': [250000, 120000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 30833, 'cushion': 30833, 'shortage': 0, 'refund': 49167, 'monthly': 30833}], ['control 2', {'disbursements': [36000], 'low_point': 0, 'cushion_months': 5, 'refund_threshold': 5000}, {'base': 3000, 'cushion': 15000, 'shortage': 15000, 'refund': 0, 'monthly': 4250}], ['control 3', {'disbursements': [7, 250000], 'low_point': 80000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 20834, 'cushion': 0, 'shortage': 0, 'refund': 80000, 'monthly': 20834}], ['control 4', {'disbursements': [7, 36000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 3001, 'cushion': 3001, 'shortage': 0, 'refund': 76999, 'monthly': 3001}], ['control 5', {'disbursements': [120000], 'low_point': 40000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 20000, 'shortage': 0, 'refund': 20000, 'monthly': 10000}], ['control 6', {'disbursements': [7, 36000, 7], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 3001, 'cushion': 3001, 'shortage': 0, 'refund': 76999, 'monthly': 3001}]], [['regression: shortage spread rounding', {'disbursements': [36000], 'low_point': -5000, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 3000, 'cushion': 0, 'shortage': 5000, 'refund': 0, 'monthly': 3417}], ['regression: shortage spread rounding, partial-repair probe', {'disbursements': [36000, 120000], 'low_point': 0, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 13000, 'cushion': 13000, 'shortage': 13000, 'refund': 0, 'monthly': 14084}], ['control 1', {'disbursements': [99999, 36000], 'low_point': 150000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 11333, 'cushion': 11333, 'shortage': 0, 'refund': 138667, 'monthly': 11333}], ['control 2', {'disbursements': [36000, 7], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 0}, {'base': 3001, 'cushion': 15003, 'shortage': 0, 'refund': 134997, 'monthly': 3001}], ['control 3', {'disbursements': [120000, 250000, 99999], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 39167, 'shortage': 0, 'refund': 40833, 'monthly': 39167}], ['control 4', {'disbursements': [36000, 7, 250000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 23834, 'cushion': 47668, 'shortage': 0, 'refund': 102332, 'monthly': 23834}], ['control 5', {'disbursements': [36000], 'low_point': 10000, 'cushion_months': 2, 'refund_threshold': 0}, {'base': 3000, 'cushion': 6000, 'shortage': 0, 'refund': 4000, 'monthly': 3000}]], [['regression: shortage spread rounding', {'disbursements': [99999], 'low_point': -5000, 'cushion_months': 0, 'refund_threshold': 20000}, {'base': 8333, 'cushion': 0, 'shortage': 5000, 'refund': 0, 'monthly': 8750}], ['regression: shortage spread rounding, partial-repair probe', {'disbursements': [120000, 99999], 'low_point': -5000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 18333, 'cushion': 36667, 'shortage': 41667, 'refund': 0, 'monthly': 21806}], ['control 1', {'disbursements': [120000], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 50000, 'shortage': 0, 'refund': 100000, 'monthly': 10000}], ['control 2', {'disbursements': [7], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 1, 'cushion': 3, 'shortage': 0, 'refund': 79997, 'monthly': 1}], ['control 3', {'disbursements': [7, 99999, 36000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 11334, 'cushion': 22668, 'shortage': 0, 'refund': 127332, 'monthly': 11334}], ['control 4', {'disbursements': [120000], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 50000, 'shortage': 0, 'refund': 30000, 'monthly': 10000}], ['control 5', {'disbursements': [120000, 36000, 99999], 'low_point': 40000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 21333, 'cushion': 0, 'shortage': 0, 'refund': 40000, 'monthly': 21333}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    def rnd(n, d):
        q, r = divmod(n, d)
        return q + (1 if 2 * r >= d else 0)
    total = sum(x['disbursements'])
    base = rnd(total, 12)
    cushion = rnd(total * x['cushion_months'], 12)
    diff = x['low_point'] - cushion
    shortage = max(0, -diff)
    surplus = max(0, diff)
    refund = surplus if surplus >= x['refund_threshold'] else 0
    monthly = base + rnd(shortage, 12) - (0 if refund else surplus // 12)
    return {'base': base, 'cushion': cushion, 'shortage': shortage, 'refund': refund, 'monthly': monthly}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: shortage spread rounding', {'disbursements': [120000, 36000, 99999], 'low_point': -5000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 21333, 'cushion': 42667, 'shortage': 47667, 'refund': 0, 'monthly': 25306}], ['control 1', {'disbursements': [99999, 250000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 29167, 'cushion': 29167, 'shortage': 0, 'refund': 50833, 'monthly': 29167}], ['control 2', {'disbursements': [36000, 36000, 120000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 16000, 'cushion': 32000, 'shortage': 0, 'refund': 118000, 'monthly': 16000}], ['control 3', {'disbursements': [99999, 7], 'low_point': 80000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 8334, 'cushion': 16668, 'shortage': 0, 'refund': 63332, 'monthly': 8334}], ['control 4', {'disbursements': [120000], 'low_point': 40000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 0, 'shortage': 0, 'refund': 40000, 'monthly': 10000}], ['control 5', {'disbursements': [250000, 250000, 250000], 'low_point': 150000, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 62500, 'cushion': 0, 'shortage': 0, 'refund': 150000, 'monthly': 62500}], ['control 6', {'disbursements': [99999], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 8333, 'cushion': 41666, 'shortage': 0, 'refund': 38334, 'monthly': 8333}]], [['regression: shortage spread rounding', {'disbursements': [250000, 99999, 120000], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 195833, 'shortage': 45833, 'refund': 0, 'monthly': 42987}], ['control 1', {'disbursements': [120000, 36000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 13000, 'cushion': 13000, 'shortage': 0, 'refund': 67000, 'monthly': 13000}], ['control 2', {'disbursements': [36000], 'low_point': 10000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 3000, 'cushion': 6000, 'shortage': 0, 'refund': 0, 'monthly': 2667}], ['control 3', {'disbursements': [7, 36000], 'low_point': 0, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 3001, 'cushion': 0, 'shortage': 0, 'refund': 0, 'monthly': 3001}], ['control 4', {'disbursements': [120000, 120000], 'low_point': 40000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 20000, 'cushion': 40000, 'shortage': 0, 'refund': 0, 'monthly': 20000}], ['control 5', {'disbursements': [120000], 'low_point': 150000, 'cushion_months': 1, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 10000, 'shortage': 0, 'refund': 140000, 'monthly': 10000}], ['control 6', {'disbursements': [7, 99999, 36000], 'low_point': 80000, 'cushion_months': 0, 'refund_threshold': 20000}, {'base': 11334, 'cushion': 0, 'shortage': 0, 'refund': 80000, 'monthly': 11334}]], [['regression: shortage spread rounding', {'disbursements': [120000, 36000], 'low_point': 0, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 13000, 'cushion': 13000, 'shortage': 13000, 'refund': 0, 'monthly': 14084}], ['control 1', {'disbursements': [250000, 120000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 30833, 'cushion': 30833, 'shortage': 0, 'refund': 49167, 'monthly': 30833}], ['control 2', {'disbursements': [36000], 'low_point': 0, 'cushion_months': 5, 'refund_threshold': 5000}, {'base': 3000, 'cushion': 15000, 'shortage': 15000, 'refund': 0, 'monthly': 4250}], ['control 3', {'disbursements': [7, 250000], 'low_point': 80000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 20834, 'cushion': 0, 'shortage': 0, 'refund': 80000, 'monthly': 20834}], ['control 4', {'disbursements': [7, 36000], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 0}, {'base': 3001, 'cushion': 3001, 'shortage': 0, 'refund': 76999, 'monthly': 3001}], ['control 5', {'disbursements': [120000], 'low_point': 40000, 'cushion_months': 2, 'refund_threshold': 5000}, {'base': 10000, 'cushion': 20000, 'shortage': 0, 'refund': 20000, 'monthly': 10000}], ['control 6', {'disbursements': [7, 36000, 7], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 3001, 'cushion': 3001, 'shortage': 0, 'refund': 76999, 'monthly': 3001}]], [['regression: shortage spread rounding', {'disbursements': [36000], 'low_point': -5000, 'cushion_months': 0, 'refund_threshold': 0}, {'base': 3000, 'cushion': 0, 'shortage': 5000, 'refund': 0, 'monthly': 3417}], ['regression: shortage spread rounding, partial-repair probe', {'disbursements': [36000, 120000], 'low_point': 0, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 13000, 'cushion': 13000, 'shortage': 13000, 'refund': 0, 'monthly': 14084}], ['control 1', {'disbursements': [99999, 36000], 'low_point': 150000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 11333, 'cushion': 11333, 'shortage': 0, 'refund': 138667, 'monthly': 11333}], ['control 2', {'disbursements': [36000, 7], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 0}, {'base': 3001, 'cushion': 15003, 'shortage': 0, 'refund': 134997, 'monthly': 3001}], ['control 3', {'disbursements': [120000, 250000, 99999], 'low_point': 80000, 'cushion_months': 1, 'refund_threshold': 20000}, {'base': 39167, 'cushion': 39167, 'shortage': 0, 'refund': 40833, 'monthly': 39167}], ['control 4', {'disbursements': [36000, 7, 250000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 23834, 'cushion': 47668, 'shortage': 0, 'refund': 102332, 'monthly': 23834}], ['control 5', {'disbursements': [36000], 'low_point': 10000, 'cushion_months': 2, 'refund_threshold': 0}, {'base': 3000, 'cushion': 6000, 'shortage': 0, 'refund': 4000, 'monthly': 3000}]], [['regression: shortage spread rounding', {'disbursements': [99999], 'low_point': -5000, 'cushion_months': 0, 'refund_threshold': 20000}, {'base': 8333, 'cushion': 0, 'shortage': 5000, 'refund': 0, 'monthly': 8750}], ['regression: shortage spread rounding, partial-repair probe', {'disbursements': [120000, 99999], 'low_point': -5000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 18333, 'cushion': 36667, 'shortage': 41667, 'refund': 0, 'monthly': 21806}], ['control 1', {'disbursements': [120000], 'low_point': 150000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 50000, 'shortage': 0, 'refund': 100000, 'monthly': 10000}], ['control 2', {'disbursements': [7], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 1, 'cushion': 3, 'shortage': 0, 'refund': 79997, 'monthly': 1}], ['control 3', {'disbursements': [7, 99999, 36000], 'low_point': 150000, 'cushion_months': 2, 'refund_threshold': 20000}, {'base': 11334, 'cushion': 22668, 'shortage': 0, 'refund': 127332, 'monthly': 11334}], ['control 4', {'disbursements': [120000], 'low_point': 80000, 'cushion_months': 5, 'refund_threshold': 20000}, {'base': 10000, 'cushion': 50000, 'shortage': 0, 'refund': 30000, 'monthly': 10000}], ['control 5', {'disbursements': [120000, 36000, 99999], 'low_point': 40000, 'cushion_months': 0, 'refund_threshold': 5000}, {'base': 21333, 'cushion': 0, 'shortage': 0, 'refund': 40000, 'monthly': 21333}]]]
for label, args, expected in fixtures[N-1]:
    try:
        actual = solve(args)
    except Exception as exc:
        actual = 'raised ' + type(exc).__name__
    check(label, actual, 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)

prompt:
Twelve shortage installments do not recover the whole shortage.

x = {'disbursements': annual amounts, 'low_point': projected lowest balance, 'cushion_months', 'refund_threshold'}. total = sum; base = round_half_up(total/12); cushion = round_half_up(total*cushion_months/12); diff = low_point - cushion; shortage = max(0, -diff) is collected over 12 months rounded up; surplus = max(0, diff) is refunded when >= refund_threshold, otherwise floor(surplus/12) is credited monthly. Return {'base', 'cushion', 'shortage', 'refund', 'monthly'}.

split: open-access