"""Own explicit early-stop state machine on a fabricated history; no weights."""
from decimal import Decimal as D
import json
H=[('1.1','1.00'),('.9','.80'),('.7','.79'),('.6','.795'),('.5','.80'),('.4','.78')]
def run(patience,delta,restore=True,start_epoch=1):
    if patience<0 or delta<0 or start_epoch<1:raise ValueError('invalid control')
    best=None;best_epoch=None;wait=0;rows=[];stop=None
    for epoch,(train,val) in enumerate(H,1):
        value=D(val)
        if epoch<start_epoch:rows.append({'epoch':epoch,'monitoring':False,'best_epoch':None,'wait':0,'stop':False});continue
        improvement=best is None or value<best-delta
        if improvement:best=value;best_epoch=epoch;wait=0
        else:wait+=1
        stopping=not improvement and wait>=patience
        rows.append({'epoch':epoch,'monitoring':True,'improved':improvement,'best_epoch':best_epoch,'wait':wait,'stop':stopping})
        if stopping:stop=epoch;break
    last=rows[-1]['epoch'];selected=best_epoch if restore else last
    return {'history':rows,'stop_epoch':stop,'best_epoch':best_epoch,'selected_epoch':selected,'restore_best':restore}
if __name__=='__main__':
    a=run(2,D(0));b=run(2,D('.02'));last=run(2,D(0),False)
    assert (a['stop_epoch'],a['best_epoch'],a['selected_epoch'])==(5,3,3)
    assert (b['stop_epoch'],b['best_epoch'],b['selected_epoch'])==(4,2,2)
    assert last['selected_epoch']==5 and run(0,D(0))['stop_epoch']==4
    assert not (D('.78')<D('.80')-D('.02'))
    assert run(2,D(0),start_epoch=2)['history'][0]['monitoring'] is False
    print(json.dumps({'A_delta0_patience2':a,'B_delta02_patience2':b,'A_without_restore':last,'actual_weights_saved':False,'real_training_run':False},indent=2))
