Exemple #1
0
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
Exemple #2
0
 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
Exemple #3
0
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()
Exemple #4
0
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
Exemple #5
0
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
Exemple #6
0
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')
Exemple #7
0
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]
Exemple #8
0
 def __itruediv__(self, y):
     tmp = self / y
     del self
     self = pyobs.observable(tmp)
     del tmp
     return self
Exemple #9
0
 def __imul__(self, y):
     tmp = self * y
     del self
     self = pyobs.observable(tmp)
     del tmp
     return self
Exemple #10
0
 def __isub__(self, y):
     tmp = self - y
     del self
     self = pyobs.observable(tmp)
     del tmp
     return self
Exemple #11
0
 def __iadd__(self, y):
     tmp = self + y
     del self
     self = pyobs.observable(tmp)
     del tmp
     return self
Exemple #12
0
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()
Exemple #13
0
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
Exemple #14
0
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
Exemple #15
0
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()