FA-61866 / Currency rounding and FX conversion / Open access
The source leg multiplies by the per-USD rate instead of dividing · case 01
Converting euros to yen overstates the result by the square of the euro rate relationship.
ROOT CAUSE
Rates are units per USD, but the source amount is multiplied by rate[frm] when moving into USD.
VERIFIED REPAIR
Divide by the source rate to reach USD and multiply by the target rate to leave USD.
Unsuccessful approach: Flipping both legs treats the table as USD per unit, which is the inverse of the stated quote convention.
Case contract
solve(amount, frm, to, rates): rates maps a currency to units of that currency per 1 USD (decimal strings); USD is implicitly 1 when absent. Convert exactly as amount / rate[frm] * rate[to] with no intermediate rounding, then round half-even to the target exponent (USD/EUR/GBP/CHF/SEK/NOK 2, JPY/KRW 0, KWD 3, CLF 4) and return a plain string. A missing rate returns 'ERR:no-rate:<code>', a zero or negative rate 'ERR:bad-rate:<code>' (source checked first).
Why this case matters
Currency amounts must be rounded at the right stage and in the right unit, or ledgers, quotes and settlements drift by minor units.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
from decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_FLOOR, ROUND_CEILING, ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN
N = 1
observations = []
def solve(amount, frm, to, rates):
exps = {'USD': 2, 'EUR': 2, 'GBP': 2, 'CHF': 2, 'SEK': 2, 'NOK': 2, 'JPY': 0, 'KRW': 0, 'KWD': 3, 'CLF': 4}
def rate(c):
if c == 'USD' and c not in rates: return Decimal(1)
if c not in rates: return None
return Decimal(rates[c])
rf, rt = rate(frm), rate(to)
for c, r in ((frm, rf), (to, rt)):
if r is None: return 'ERR:no-rate:' + c
if r <= 0: return 'ERR:bad-rate:' + c
usd = Decimal(amount) * rf
out = usd * rt
return format(out.quantize(Decimal(1).scaleb(-exps[to]), rounding=ROUND_HALF_EVEN), 'f')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression leg-direction 1',
('100', 'EUR', 'JPY',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16453'),
('regression leg-direction 2',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33'),
('partial repair guard 2',
('100.00', 'USD', 'KWD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'30.710'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK'),
('control: won to franc',
('250000', 'KRW', 'CHF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'162.68'),
('control: yen to unit of account',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')],
[('regression leg-direction 1',
('250000', 'KRW', 'CHF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'162.68'),
('regression leg-direction 2',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('partial repair guard 1',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
('control: explicit usd rate', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
('control: usd absent', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11')],
[('regression leg-direction 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
('regression leg-direction 2',
('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
'69130.43'),
('partial repair guard 1',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('partial repair guard 2', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
('control: euro to yen',
('100', 'EUR', 'JPY',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16453'),
('control: usd to dinar',
('100.00', 'USD', 'KWD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'30.710'),
('control: pound to usd',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33')],
[('regression leg-direction 1',
('183948.179', 'CHF', 'EUR',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'192287.61'),
('regression leg-direction 2',
('16420.708', 'CLF', 'CLF', {'EUR': '0.92', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451', 'CHF': '0.8801'}),
'16420.7080'),
('partial repair guard 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
('partial repair guard 2',
('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
'69130.43'),
('control: euro to yen',
('100', 'EUR', 'JPY',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16453'),
('control: usd to dinar',
('100.00', 'USD', 'KWD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'30.710'),
('control: pound to usd',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK')],
[('regression leg-direction 1',
('113222', 'EUR', 'CLF',
{'EUR': '0.92', 'JPY': '151.37', 'KWD': '0.3071', 'GBP': '0.7893', 'CLF': '0.02451', 'CHF': '0.8801'}),
'3016.3818'),
('regression leg-direction 2',
('19481.34', 'KWD', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'63436.47'),
('partial repair guard 1',
('183948.179', 'CHF', 'EUR',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'192287.61'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK'),
('control: won to franc',
('250000', 'KRW', 'CHF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'162.68'),
('control: yen to unit of account',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')]]
for label, args, expected in cases[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression leg-direction 1 | 13926 | 16453 | Failed |
| regression leg-direction 2 | 3.95 | 6.33 | Failed |
| partial repair guard 2 | 30.710 | 30.710 | Passed |
| control: missing target | ERR:no-rate:SEK | ERR:no-rate:SEK | Passed |
| control: won to franc | 297583812.50 | 162.68 | Failed |
| control: yen to unit of account | 371004.1599 | 16.1920 | Failed |
| control: zero rate target | ERR:bad-rate:CHF | ERR:bad-rate:CHF | Passed |
SHA-256 / d6c44ec7d3ba8c9d109782b4133bad029bc1711246118efec2bbb0ce20ab6504
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
from decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_FLOOR, ROUND_CEILING, ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN
N = 1
observations = []
def solve(amount, frm, to, rates):
exps = {'USD': 2, 'EUR': 2, 'GBP': 2, 'CHF': 2, 'SEK': 2, 'NOK': 2, 'JPY': 0, 'KRW': 0, 'KWD': 3, 'CLF': 4}
def rate(c):
if c == 'USD' and c not in rates: return Decimal(1)
if c not in rates: return None
return Decimal(rates[c])
rf, rt = rate(frm), rate(to)
for c, r in ((frm, rf), (to, rt)):
if r is None: return 'ERR:no-rate:' + c
if r <= 0: return 'ERR:bad-rate:' + c
usd = Decimal(amount) * rf
out = usd / rt
return format(out.quantize(Decimal(1).scaleb(-exps[to]), rounding=ROUND_HALF_EVEN), 'f')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression leg-direction 1',
('100', 'EUR', 'JPY',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16453'),
('regression leg-direction 2',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33'),
('partial repair guard 2',
('100.00', 'USD', 'KWD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'30.710'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK'),
('control: won to franc',
('250000', 'KRW', 'CHF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'162.68'),
('control: yen to unit of account',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')],
[('regression leg-direction 1',
('250000', 'KRW', 'CHF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'162.68'),
('regression leg-direction 2',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('partial repair guard 1',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
('control: explicit usd rate', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
('control: usd absent', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11')],
[('regression leg-direction 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
('regression leg-direction 2',
('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
'69130.43'),
('partial repair guard 1',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('partial repair guard 2', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
('control: euro to yen',
('100', 'EUR', 'JPY',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16453'),
('control: usd to dinar',
('100.00', 'USD', 'KWD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'30.710'),
('control: pound to usd',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33')],
[('regression leg-direction 1',
('183948.179', 'CHF', 'EUR',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'192287.61'),
('regression leg-direction 2',
('16420.708', 'CLF', 'CLF', {'EUR': '0.92', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451', 'CHF': '0.8801'}),
'16420.7080'),
('partial repair guard 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
('partial repair guard 2',
('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
'69130.43'),
('control: euro to yen',
('100', 'EUR', 'JPY',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16453'),
('control: usd to dinar',
('100.00', 'USD', 'KWD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'30.710'),
('control: pound to usd',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK')],
[('regression leg-direction 1',
('113222', 'EUR', 'CLF',
{'EUR': '0.92', 'JPY': '151.37', 'KWD': '0.3071', 'GBP': '0.7893', 'CLF': '0.02451', 'CHF': '0.8801'}),
'3016.3818'),
('regression leg-direction 2',
('19481.34', 'KWD', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'63436.47'),
('partial repair guard 1',
('183948.179', 'CHF', 'EUR',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'192287.61'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK'),
('control: won to franc',
('250000', 'KRW', 'CHF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'162.68'),
('control: yen to unit of account',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')]]
for label, args, expected in cases[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression leg-direction 1 | 1 | 16453 | Failed |
| regression leg-direction 2 | 3.95 | 6.33 | Failed |
| partial repair guard 2 | 325.627 | 30.710 | Failed |
| control: missing target | ERR:no-rate:SEK | ERR:no-rate:SEK | Passed |
| control: won to franc | 384189296.67 | 162.68 | Failed |
| control: yen to unit of account | 617578483.4761 | 16.1920 | Failed |
| control: zero rate target | ERR:bad-rate:CHF | ERR:bad-rate:CHF | Passed |
SHA-256 / d0c4be9fe817d210d916ee622ce5c819ccd5e4240b577e03489a8a9b45fffa25
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
from decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_FLOOR, ROUND_CEILING, ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN
N = 1
observations = []
def solve(amount, frm, to, rates):
exps = {'USD': 2, 'EUR': 2, 'GBP': 2, 'CHF': 2, 'SEK': 2, 'NOK': 2, 'JPY': 0, 'KRW': 0, 'KWD': 3, 'CLF': 4}
def rate(c):
if c == 'USD' and c not in rates: return Decimal(1)
if c not in rates: return None
return Decimal(rates[c])
rf, rt = rate(frm), rate(to)
for c, r in ((frm, rf), (to, rt)):
if r is None: return 'ERR:no-rate:' + c
if r <= 0: return 'ERR:bad-rate:' + c
usd = Decimal(amount) / rf
out = usd * rt
return format(out.quantize(Decimal(1).scaleb(-exps[to]), rounding=ROUND_HALF_EVEN), 'f')
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
cases = [[('regression leg-direction 1',
('100', 'EUR', 'JPY',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16453'),
('regression leg-direction 2',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33'),
('partial repair guard 2',
('100.00', 'USD', 'KWD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'30.710'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK'),
('control: won to franc',
('250000', 'KRW', 'CHF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'162.68'),
('control: yen to unit of account',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')],
[('regression leg-direction 1',
('250000', 'KRW', 'CHF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'162.68'),
('regression leg-direction 2',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('partial repair guard 1',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
('control: explicit usd rate', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
('control: usd absent', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11')],
[('regression leg-direction 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
('regression leg-direction 2',
('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
'69130.43'),
('partial repair guard 1',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('partial repair guard 2', ('10', 'USD', 'EUR', {'USD': '1', 'EUR': '0.92'}), '9.20'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF'),
('control: euro to yen',
('100', 'EUR', 'JPY',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16453'),
('control: usd to dinar',
('100.00', 'USD', 'KWD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'30.710'),
('control: pound to usd',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33')],
[('regression leg-direction 1',
('183948.179', 'CHF', 'EUR',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'192287.61'),
('regression leg-direction 2',
('16420.708', 'CLF', 'CLF', {'EUR': '0.92', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451', 'CHF': '0.8801'}),
'16420.7080'),
('partial repair guard 1', ('42.42', 'EUR', 'USD', {'EUR': '0.92'}), '46.11'),
('partial repair guard 2',
('63600', 'EUR', 'USD', {'EUR': '0.92', 'JPY': '151.37', 'KRW': '1352.5', 'KWD': '0.3071', 'CLF': '0.02451'}),
'69130.43'),
('control: euro to yen',
('100', 'EUR', 'JPY',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16453'),
('control: usd to dinar',
('100.00', 'USD', 'KWD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'30.710'),
('control: pound to usd',
('5', 'GBP', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'6.33'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK')],
[('regression leg-direction 1',
('113222', 'EUR', 'CLF',
{'EUR': '0.92', 'JPY': '151.37', 'KWD': '0.3071', 'GBP': '0.7893', 'CLF': '0.02451', 'CHF': '0.8801'}),
'3016.3818'),
('regression leg-direction 2',
('19481.34', 'KWD', 'USD',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'63436.47'),
('partial repair guard 1',
('183948.179', 'CHF', 'EUR',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'192287.61'),
('control: missing target',
('1', 'EUR', 'SEK',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'ERR:no-rate:SEK'),
('control: won to franc',
('250000', 'KRW', 'CHF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'162.68'),
('control: yen to unit of account',
('99999', 'JPY', 'CLF',
{'EUR': '0.92',
'JPY': '151.37',
'KRW': '1352.5',
'KWD': '0.3071',
'GBP': '0.7893',
'CLF': '0.02451',
'CHF': '0.8801'}),
'16.1920'),
('control: zero rate target', ('10', 'EUR', 'CHF', {'EUR': '0.92', 'CHF': '0'}), 'ERR:bad-rate:CHF')]]
for label, args, expected in cases[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression leg-direction 1 | 16453 | 16453 | Passed |
| regression leg-direction 2 | 6.33 | 6.33 | Passed |
| partial repair guard 2 | 30.710 | 30.710 | Passed |
| control: missing target | ERR:no-rate:SEK | ERR:no-rate:SEK | Passed |
| control: won to franc | 162.68 | 162.68 | Passed |
| control: yen to unit of account | 16.1920 | 16.1920 | Passed |
| control: zero rate target | ERR:bad-rate:CHF | ERR:bad-rate:CHF | Passed |
SHA-256 / 16588d69801e00da82127f0f1348ace93c78d0c4a81221710293015ad91d21fc
Verification & scope
A deterministic, bounded teaching model with a stipulated toy contract; it makes no claim of conformance to any real regulation, standard, or institution's rules. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:46:59.349363+00:00.
Case digest / dfdceccb36af7449b907dbc7a8124033aad843d79d96dfefccbeaa5479905a02