"""Exactness + timing of the fast floatyear_to_date, on one core.""" import os, sys, time import numpy as np HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, HERE + '/..'); sys.path.insert(0, HERE) import aletsch_forward as af import fastdate from oggm.utils import _funcs # 1. Exactness against the original rng = np.random.default_rng(0) yrs = np.concatenate([rng.uniform(1000, 2100, 200000), (np.arange(1000, 2100)[:, None] + np.arange(12) / 12).ravel(), (np.arange(1000, 2100)[:, None] + np.arange(366) / 365).ravel(), (np.arange(1000, 2100)[:, None] + np.arange(367) / 366).ravel(), np.nextafter(np.arange(1000., 2100.), 0), np.arange(1000., 2100.)]) bad = 0 for y in yrs: a, b = fastdate._orig(y), fastdate.fast_floatyear_to_date(y) bad += (int(a[0]) != int(b[0])) or (int(a[1]) != int(b[1])) print(f'exactness: {len(yrs)} dates, {bad} differ') # 2. Timing and identical output for rid in ['RGI60-11.01450', 'RGI60-11.03845']: af.RGI_ID = rid gdir = af.setup(os.environ['WORKDIR'] + '/' + rid) s = gdir.settings th = (s['melt_f'], s['prcp_fac'], s['temp_bias']) res = {} for mode in ['orig', 'fast', 'orig2', 'fast2']: if mode.startswith('fast'): fastdate.patch() else: import oggm.utils as u u.floatyear_to_date = fastdate._orig; _funcs.floatyear_to_date = fastdate._orig ts = [] for i in range(4): t0 = time.time() out, ds = af.forward(gdir, *th, suffix=f'_{mode}{i}') ts.append(time.time() - t0) res[mode] = (np.median(ts), out, ds['volume'].values if 'volume' in ds else ds['volume_m3'].values) same = np.array_equal(res['orig'][2], res['fast'][2], equal_nan=True) print(f'{rid}: orig {res["orig"][0]:.2f}/{res["orig2"][0]:.2f} s, fast {res["fast"][0]:.2f}/{res["fast2"][0]:.2f} s, ' f'volume series identical: {same}, preds orig {res["orig"][1]["dmdtda_rgi_area"]:.3f} fast {res["fast"][1]["dmdtda_rgi_area"]:.3f}')