"""Local fictional learning reference. No website/database/cloud connection."""
import csv,json,sqlite3,hashlib,math,re,statistics,collections
from pathlib import Path

def dl_arrays():
 import numpy as np
 rng=np.random.default_rng(8);x=rng.normal(size=(40,2));y=(x[:,0]+.6*x[:,1]>0).astype(float)
 return x,y

def dl_backprop(source,out):
 import numpy as np
 x,y=dl_arrays();x=x[:24];y=y[:24];w=np.array([.1,-.1]);b=.0
 def loss(w,b):
  z=x@w+b;return float(np.mean(np.logaddexp(0,z)-y*z))
 z=x@w+b;p=1/(1+np.exp(-z));grad=x.T@(p-y)/len(y);eps=1e-5
 finite=np.array([(loss(w+np.eye(2)[i]*eps,b)-loss(w-np.eye(2)[i]*eps,b))/(2*eps) for i in range(2)])
 before=loss(w,b);after=loss(w-.1*grad,b-.1*float((p-y).mean()))
 return {'training_rows':24,'loss_before':before,'loss_after_one_step':after,'analytic_gradient':grad.tolist(),'finite_difference_gradient':finite.tolist(),'max_gradient_error':float(np.max(np.abs(grad-finite))),'test_used':False}

if __name__=='__main__':
    import argparse,platform
    parser=argparse.ArgumentParser();parser.add_argument('--source',default='.');parser.add_argument('--output',required=True);args=parser.parse_args()
    source=Path(args.source).resolve();out=Path(args.output).resolve()
    if source==out:raise ValueError('Source and output must differ')
    out.mkdir(parents=False,exist_ok=False)
    # Partial folders after an error are NOT successful; result.json is written last.
    result=dl_backprop(source,out)
    with (out/'result.json').open('x',encoding='utf-8') as handle:json.dump(result,handle,indent=2,allow_nan=False);handle.write(chr(10))
    print(json.dumps(result,indent=2,allow_nan=False))
