def load(fname): tmp = json.loads(gzip.open(fname, 'r').read()) res = pyobs.observable(description=tmp['description']) res.www = list(tmp['www']) res.mean = numpy.array(tmp['mean']) res.shape = tuple(tmp['shape']) res.size=numpy.prod(res.shape) res.ename = list(tmp['ename']) for key in tmp['delta']: if (type(tmp['delta'][key]['idx']) is str): regex=re.compile('[(,)]') h = regex.split(tmp['delta'][key]['idx']) if h[0]!='range': # pragma: no cover raise pyobs.PyobsError('Unexpected idx') res.delta[key] = pyobs.core.data.delta(tmp['delta'][key]['mask'],range(int(h[1]),int(h[2]),int(h[3])),lat=tmp['delta'][key]['lat']) else: res.delta[key] = pyobs.core.data.delta(tmp['delta'][key]['mask'],tmp['delta'][key]['idx'],lat=tmp['delta'][key]['lat']) res.delta[key].delta = numpy.array(tmp['delta'][key]['delta']) for key in tmp['cdata']: res.cdata[key] = pyobs.core.cdata.cdata(tmp['cdata'][key]['cov']) pyobs.memory.update(res) return res
def decode(self, obj): out = pyobs.observable(description=obj['description']) out.set_mean(obj['mean']) assert (out.shape == obj['shape']) assert (out.size == obj['size']) out.ename = obj['ename'] out.delta = obj['delta'] out.cdata = obj['cdata'] pyobs.memory.update(out) return out
import pyobs import numpy val = [-230, 23] cov = [(val[0] * 5)**2, (val[1] * 2)**2] N = 1000 tau = 2.0 data = pyobs.random.acrandn(val, cov, tau, N) obsA = pyobs.observable() obsA.create('EnsA', data.flatten(), shape=(2, )) print(obsA) print(obsA[0] - obsA[1]) print(-obsA) print(obsA @ numpy.array([2., 3.])) print(1.0 + obsA) print(3.4 - obsA) print(3.14 / obsA) pyobs.memory.info() obsB = obsA[0] obsB += obsA[1] pyobs.memory.info() obsB.peek()
import pyobs import numpy mu = [3.14, 6.14] cov = numpy.array([[0.01, 0.002], [0.002, 0.02]])**2 N = 500 tau = 0.0 data = pyobs.random.acrandn(mu, cov, tau, N) mask = [True] * N mask[1] = False mask[-1] = False obsA = pyobs.observable() obsA.create('test', data[:, 0][mask], icnfg=[0] + list(range(2, N - 1))) print(obsA) [a, da] = obsA.error() obsB = pyobs.observable() obsB.create('test', data[:, 1], icnfg=range(0, N)) [b, db] = obsB.error() obsC = obsB / (2.0 * obsA) [c, dc] = obsC.error() ddc = obsC.error_of_error() cov = numpy.array(cov) g = numpy.array([-b / (2.0 * a * a), 1 / (2.0 * a)]) err = numpy.sqrt((g.T @ cov @ g) / N) assert abs(err - dc) < ddc
def derobs(inps, mean, grads, description=None): t0 = time() pyobs.check_type(inps, 'inps', list) pyobs.check_type(mean, 'mean', numpy.ndarray, int, float, numpy.float32, numpy.float64) pyobs.check_type(grads, 'grads', list) if len(inps) != len(grads): raise pyobs.PyobsError('Incompatible inps and grads') if description is None: description = ', '.join(set([i.description for i in inps])) res = pyobs.observable(description=description) res.set_mean(mean) allkeys = [] for i in inps: for dn in i.delta: if not dn in allkeys: allkeys.append(dn) for key in allkeys: new_idx = [] new_mask = [] lat = None for i in range(len(inps)): if key in inps[i].delta: data = inps[i].delta[key] h = grads[i].get_mask(data.mask) if not h is None: new_mask += h if not new_idx: new_idx = data.idx else: new_idx = merge_idx(new_idx, data.idx) if lat is None: lat = data.lat else: if numpy.any(lat != data.lat): # pragma: no cover raise pyobs.PyobsError( f'Unexpected lattice size for master fields with same tag' ) if len(new_mask) > 0: res.delta[key] = delta(list(set(new_mask)), new_idx, lat=lat) for i in range(len(inps)): if key in inps[i].delta: res.delta[key].axpy(grads[i], inps[i].delta[key]) res.ename = [] for key in res.delta: name = key.split(':')[0] if not name in res.ename: res.ename.append(name) res.cdata = {} allkeys = [] for i in inps: for cd in i.cdata: if not cd in allkeys: allkeys.append(cd) for key in allkeys: for i in range(len(inps)): if key in inps[i].cdata: if not key in res.cdata: res.cdata[key] = cdata(numpy.zeros(res.size)) res.cdata[key].axpy(grads[i], inps[i].cdata[key]) pyobs.memory.update(res) if pyobs.is_verbose('derobs'): print(f'derobs executed in {time()-t0:g} secs') return res
import pyobs import os import numpy data = pyobs.random.acrandn([2.31,3.14],[0.2**2,0.1**2],4.0,3000) test = pyobs.observable(description='save/load test') test.create('test',data.flatten(),icnfg=range(0,3000*4,4),rname='rep1',shape=(2,)) test.add_syst_err('syst. err',[0.01,0.01]) p=os.path.realpath(__file__)[:-10] data = numpy.loadtxt(f'{p}../core/mfield-32x32x32-obs.txt.gz') mfobs = pyobs.observable() mfobs.create(f'test-mfield',data,lat=[32,32,32]) test1 = pyobs.concatenate(test[0], test[0]*mfobs) pyobs.save('./test-io.pyobs',{'test-observable': test1, 'metadata': 'the test observable', 'indices': [4,8]}) test2 = pyobs.load('./test-io.pyobs') [v, e] = test1.error() test3 = test2['test-observable'] [v2, e2] = test3.error() assert numpy.all(e==e2) assert numpy.all(test1.mean == test3.mean) for key in test.delta: assert numpy.all(test1.delta[key].delta == test3.delta[key].delta) assert (test2['metadata'] == 'the test observable')
import pyobs import numpy mat = [2, 0.5, 0.5, 3.5] cov = (numpy.array(mat) * 0.05)**2 data = pyobs.random.acrandn(mat, cov, 1.0, 4000) omat = pyobs.observable() omat.create('test', data.flatten(), shape=(2, 2)) [v, e] = omat.error() print(pyobs.valerr(v, e)) #check inverse def func(x): return numpy.linalg.inv(x) g = pyobs.num_grad(omat, func) g0 = pyobs.gradient(g) [v0, e0] = pyobs.derobs([omat], func(omat.mean), [g0]).error() [v1, e1] = pyobs.linalg.inv(omat).error() assert numpy.all(numpy.fabs(v0 - v1) < 1e-12) assert numpy.all(numpy.fabs(e0 - e1) < 1e-10) # check eigenvalues, both symmetric and non-symmetric cases def func(x): return numpy.linalg.eig(x)[0]
def __itruediv__(self, y): tmp = self / y del self self = pyobs.observable(tmp) del tmp return self
def __imul__(self, y): tmp = self * y del self self = pyobs.observable(tmp) del tmp return self
def __isub__(self, y): tmp = self - y del self self = pyobs.observable(tmp) del tmp return self
def __iadd__(self, y): tmp = self + y del self self = pyobs.observable(tmp) del tmp return self
import numpy T = 16 L = 16 mass = 0.25 p = 0.0 xax = range(T // 2) corr_ex = [pyobs.qft.free_scalar.Cphiphi(x, mass, p, T, L) for x in xax] cov_ex = pyobs.qft.free_scalar.cov_Cphiphi(mass, p, T, L)[0:T // 2, 0:T // 2] N = 4000 tau = 1.0 data = pyobs.random.acrandn(corr_ex, cov_ex, tau, N) corr = pyobs.observable() corr.create(f'm{mass:g}-{L}x{T}', data.flatten(), shape=(len(xax), )) print(corr) [c, dc] = corr.error() [c0, dc0] = pyobs.reshape(corr, (len(xax) // 2, 2)).error() assert numpy.all(abs(dc0 - numpy.reshape(dc, (len(xax) // 2, 2))) < 1e-12) corr1 = corr[0:4] corr2 = corr[4:] tmp = pyobs.observable() tmp = pyobs.concatenate(tmp, corr1) del tmp tmp = pyobs.observable()
import pyobs import numpy # t0 = 0.02 fm val = 0.02 sig = val * 0.01 N = 1000 tau = 4.0 data = pyobs.random.acrand(val, sig, tau, N) t0 = pyobs.observable() t0.create('EnsA', data, rname='r001') # below we assume pion mass known to 1% mpi = pyobs.observable() mpi.create_from_cov('pion mass', 134.9, 0.1**2) [m, dm] = mpi.error() assert abs(dm[0] - 0.1) < 1e-12 print('t0 = ', t0) print('mpi = ', mpi) phi = t0 * (mpi / 197.)**2 print('phi = ', phi) [t, dt] = t0.error() [m, dm] = (mpi / 197.).error() [p, dp] = phi.error() assert dp - numpy.sqrt((dt * m**2)**2 + (2.0 * t * m * dm)**2) < 1e-10
T = 32 L = 16 m = 0.2 p = 0.0 corr_ex = [pyobs.qft.free_scalar.Cphiphi(t,m,p,T,L) for t in range(T//2)] cov_ex = pyobs.qft.free_scalar.cov_Cphiphi(m,p,T,L)[0:T//2,0:T//2] numpy.random.seed(46) tau = 1.0 N = 2000 data = pyobs.random.acrandn(corr_ex, cov_ex, tau, N) corr1 = pyobs.observable() corr1.create('EnsA',data.flatten(),shape=(T//2,)) func = pyobs.qft.free_scalar.Cphiphi_string('t','m',p,T,L) [f,df,_] = pyobs.symbolic.diff(func,'t','m') [c, dc] = corr1.error() xax = numpy.arange(T//2) W = 1./dc**2 fit1 = pyobs.mfit(xax,W,f,df,v='t') print(fit1(corr1)) tau = 1.0 N = 1000
import pyobs import numpy import os L = [32, 32, 32] p = os.path.realpath(__file__)[:-9] data = numpy.loadtxt(f'{p}/mfield-32x32x32-obs.txt.gz') mfobs = pyobs.observable() mfobs.create(f'test-mfield', data, lat=L) mfobs.peek() print(mfobs) print('a random operation', mfobs * 45 + mfobs**2) [v, e] = mfobs.error(errinfo={'test-mfield': pyobs.errinfo(W=12.0)}) print(v, e) [v, e] = mfobs.error(errinfo={'test-mfield': pyobs.errinfo(W=12.01)}) print(v, e) [v, e] = mfobs.error(errinfo={'test-mfield': pyobs.errinfo(W=[12.01])}) print(v, e) [v, e] = mfobs.error(errinfo={'test-mfield': pyobs.errinfo(W=[12.0])}) print(v, e) def func(x): return x * 45 + x**2 assert pyobs.error_bias4(mfobs, func) < func(mfobs).error_of_error()