diff --git a/docs/pyerrors/input/json.html b/docs/pyerrors/input/json.html
index c974e296..0e5ed556 100644
--- a/docs/pyerrors/input/json.html
+++ b/docs/pyerrors/input/json.html
@@ -87,6 +87,7 @@
import platform
import warnings
from ..obs import Obs
+from ..covobs import Covobs
from .. import version as pyerrorsversion
@@ -128,9 +129,25 @@
def __str__(self):
return self.__repr__()
+ class Floatlist:
+ def __init__(self, li):
+ self.li = list(li)
+
+ def __repr__(self):
+ s = '['
+ for i in range(len(self.li)):
+ if i > 0:
+ s += ', '
+ s += '%1.15e' % (self.li[i])
+ s += ']'
+ return s
+
+ def __str__(self):
+ return self.__repr__()
+
def _gen_data_d_from_list(ol):
dl = []
- for name in ol[0].e_names:
+ for name in ol[0].mc_names:
ed = {}
ed['id'] = name
ed['replica'] = []
@@ -149,6 +166,23 @@
dl.append(ed)
return dl
+ def _gen_cdata_d_from_list(ol):
+ dl = []
+ for name in ol[0].cov_names:
+ ed = {}
+ ed['id'] = name
+ ed['layout'] = str(ol[0].covobs[name].cov.shape).lstrip('(').rstrip(')').rstrip(',')
+ ed['cov'] = Floatlist(np.ravel(ol[0].covobs[name].cov))
+ ncov = ol[0].covobs[name].cov.shape[0]
+ ed['grad'] = []
+ for i in range(ncov):
+ ed['grad'].append([])
+ for o in ol:
+ ed['grad'][-1].append(o.covobs[name].grad[i][0])
+ ed['grad'][-1] = Floatlist(ed['grad'][-1])
+ dl.append(ed)
+ return dl
+
def _assert_equal_properties(ol, otype=Obs):
for o in ol:
if not isinstance(o, otype):
@@ -172,7 +206,12 @@
if o.reweighted:
d['reweighted'] = o.reweighted
d['value'] = [o.value]
- d['data'] = _gen_data_d_from_list([o])
+ data = _gen_data_d_from_list([o])
+ if len(data) > 0:
+ d['data'] = data
+ cdata = _gen_cdata_d_from_list([o])
+ if len(cdata) > 0:
+ d['cdata'] = cdata
return d
def write_List_to_dict(ol):
@@ -186,7 +225,12 @@
if ol[0].reweighted:
d['reweighted'] = ol[0].reweighted
d['value'] = [o.value for o in ol]
- d['data'] = _gen_data_d_from_list(ol)
+ data = _gen_data_d_from_list(ol)
+ if len(data) > 0:
+ d['data'] = data
+ cdata = _gen_cdata_d_from_list(ol)
+ if len(cdata) > 0:
+ d['cdata'] = cdata
return d
def write_Array_to_dict(oa):
@@ -201,7 +245,12 @@
if ol[0].reweighted:
d['reweighted'] = ol[0].reweighted
d['value'] = [o.value for o in ol]
- d['data'] = _gen_data_d_from_list(ol)
+ data = _gen_data_d_from_list(ol)
+ if len(data) > 0:
+ d['data'] = data
+ cdata = _gen_cdata_d_from_list(ol)
+ if len(cdata) > 0:
+ d['cdata'] = cdata
return d
if not isinstance(ol, list):
@@ -234,9 +283,9 @@
deltas = False
split = s.split('\n')
for i in range(len(split)):
- if '"deltas":' in split[i]:
+ if '"deltas":' in split[i] or '"cov":' in split[i] or '"grad":' in split[i]:
deltas = True
- elif deltas:
+ if deltas:
split[i] = split[i].replace('"[', '[').replace(']"', ']')
if split[i][-1] == ']':
deltas = False
@@ -302,16 +351,32 @@
def _gen_obsd_from_datad(d):
retd = {}
- retd['names'] = []
- retd['idl'] = []
- retd['deltas'] = []
- retd['is_merged'] = {}
+ if d:
+ retd['names'] = []
+ retd['idl'] = []
+ retd['deltas'] = []
+ retd['is_merged'] = {}
+ for ens in d:
+ for rep in ens['replica']:
+ retd['names'].append(rep['name'])
+ retd['idl'].append([di[0] for di in rep['deltas']])
+ retd['deltas'].append(np.array([di[1:] for di in rep['deltas']]))
+ retd['is_merged'][rep['name']] = rep.get('is_merged', False)
+ return retd
+
+ def _gen_covobsd_from_cdatad(d):
+ retd = {}
for ens in d:
- for rep in ens['replica']:
- retd['names'].append(rep['name'])
- retd['idl'].append([di[0] for di in rep['deltas']])
- retd['deltas'].append(np.array([di[1:] for di in rep['deltas']]))
- retd['is_merged'][rep['name']] = rep.get('is_merged', False)
+ retl = []
+ name = ens['id']
+ layouts = ens.get('layout', '1').strip()
+ layout = [int(ls.strip()) for ls in layouts.split(',') if len(ls) > 0]
+ cov = np.reshape(ens['cov'], layout)
+ grad = ens['grad']
+ nobs = len(grad[0])
+ for i in range(nobs):
+ retl.append({'name': name, 'cov': cov, 'grad': [g[i] for g in grad]})
+ retd[name] = retl
return retd
def get_Obs_from_dict(o):
@@ -320,11 +385,21 @@
raise Exception("layout is %s has to be 1 for type Obs." % (layouts), RuntimeWarning)
values = o['value']
- od = _gen_obsd_from_datad(o['data'])
+ od = _gen_obsd_from_datad(o.get('data', {}))
+ cd = _gen_covobsd_from_cdatad(o.get('cdata', {}))
+
+ if od:
+ ret = Obs([[ddi[0] + values[0] for ddi in di] for di in od['deltas']], od['names'], idl=od['idl'])
+ ret.is_merged = od['is_merged']
+ else:
+ ret = Obs([], [])
+ ret._value = values[0]
+ for name in cd:
+ co = cd[name][0]
+ ret._covobs[name] = Covobs(None, co['cov'], co['name'], grad=co['grad'])
+ ret.names.append(co['name'])
- ret = Obs([[ddi[0] + values[0] for ddi in di] for di in od['deltas']], od['names'], idl=od['idl'])
ret.reweighted = o.get('reweighted', False)
- ret.is_merged = od['is_merged']
ret.tag = o.get('tag', [None])[0]
return ret
@@ -332,14 +407,25 @@
layouts = o.get('layout', '1').strip()
layout = int(layouts)
values = o['value']
- od = _gen_obsd_from_datad(o['data'])
+ od = _gen_obsd_from_datad(o.get('data', {}))
+ cd = _gen_covobsd_from_cdatad(o.get('cdata', {}))
ret = []
taglist = o.get('tag', layout * [None])
for i in range(layout):
- ret.append(Obs([list(di[:, i] + values[i]) for di in od['deltas']], od['names'], idl=od['idl']))
+ if od:
+ ret.append(Obs([list(di[:, i] + values[i]) for di in od['deltas']], od['names'], idl=od['idl']))
+ ret[-1].is_merged = od['is_merged']
+ else:
+ ret.append(Obs([], []))
+ ret[-1]._value = values[i]
+ print('Created Obs with means= ', values[i])
+ for name in cd:
+ co = cd[name][i]
+ ret[-1]._covobs[name] = Covobs(None, co['cov'], co['name'], grad=co['grad'])
+ ret[-1].names.append(co['name'])
+
ret[-1].reweighted = o.get('reweighted', False)
- ret[-1].is_merged = od['is_merged']
ret[-1].tag = taglist[i]
return ret
@@ -348,14 +434,23 @@
layout = [int(ls.strip()) for ls in layouts.split(',') if len(ls) > 0]
N = np.prod(layout)
values = o['value']
- od = _gen_obsd_from_datad(o['data'])
+ od = _gen_obsd_from_datad(o.get('data', {}))
+ cd = _gen_covobsd_from_cdatad(o.get('cdata', {}))
ret = []
taglist = o.get('tag', N * [None])
for i in range(N):
- ret.append(Obs([di[:, i] + values[i] for di in od['deltas']], od['names'], idl=od['idl']))
+ if od:
+ ret.append(Obs([di[:, i] + values[i] for di in od['deltas']], od['names'], idl=od['idl']))
+ ret[-1].is_merged = od['is_merged']
+ else:
+ ret.append(Obs([], []))
+ ret[-1]._value = values[i]
+ for name in cd:
+ co = cd[name][i]
+ ret[-1]._covobs[name] = Covobs(None, co['cov'], co['name'], grad=co['grad'])
+ ret[-1].names.append(co['name'])
ret[-1].reweighted = o.get('reweighted', False)
- ret[-1].is_merged = od['is_merged']
ret[-1].tag = taglist[i]
return np.reshape(ret, layout)
@@ -489,9 +584,25 @@
def __str__(self):
return self.__repr__()
+ class Floatlist:
+ def __init__(self, li):
+ self.li = list(li)
+
+ def __repr__(self):
+ s = '['
+ for i in range(len(self.li)):
+ if i > 0:
+ s += ', '
+ s += '%1.15e' % (self.li[i])
+ s += ']'
+ return s
+
+ def __str__(self):
+ return self.__repr__()
+
def _gen_data_d_from_list(ol):
dl = []
- for name in ol[0].e_names:
+ for name in ol[0].mc_names:
ed = {}
ed['id'] = name
ed['replica'] = []
@@ -510,6 +621,23 @@
dl.append(ed)
return dl
+ def _gen_cdata_d_from_list(ol):
+ dl = []
+ for name in ol[0].cov_names:
+ ed = {}
+ ed['id'] = name
+ ed['layout'] = str(ol[0].covobs[name].cov.shape).lstrip('(').rstrip(')').rstrip(',')
+ ed['cov'] = Floatlist(np.ravel(ol[0].covobs[name].cov))
+ ncov = ol[0].covobs[name].cov.shape[0]
+ ed['grad'] = []
+ for i in range(ncov):
+ ed['grad'].append([])
+ for o in ol:
+ ed['grad'][-1].append(o.covobs[name].grad[i][0])
+ ed['grad'][-1] = Floatlist(ed['grad'][-1])
+ dl.append(ed)
+ return dl
+
def _assert_equal_properties(ol, otype=Obs):
for o in ol:
if not isinstance(o, otype):
@@ -533,7 +661,12 @@
if o.reweighted:
d['reweighted'] = o.reweighted
d['value'] = [o.value]
- d['data'] = _gen_data_d_from_list([o])
+ data = _gen_data_d_from_list([o])
+ if len(data) > 0:
+ d['data'] = data
+ cdata = _gen_cdata_d_from_list([o])
+ if len(cdata) > 0:
+ d['cdata'] = cdata
return d
def write_List_to_dict(ol):
@@ -547,7 +680,12 @@
if ol[0].reweighted:
d['reweighted'] = ol[0].reweighted
d['value'] = [o.value for o in ol]
- d['data'] = _gen_data_d_from_list(ol)
+ data = _gen_data_d_from_list(ol)
+ if len(data) > 0:
+ d['data'] = data
+ cdata = _gen_cdata_d_from_list(ol)
+ if len(cdata) > 0:
+ d['cdata'] = cdata
return d
def write_Array_to_dict(oa):
@@ -562,7 +700,12 @@
if ol[0].reweighted:
d['reweighted'] = ol[0].reweighted
d['value'] = [o.value for o in ol]
- d['data'] = _gen_data_d_from_list(ol)
+ data = _gen_data_d_from_list(ol)
+ if len(data) > 0:
+ d['data'] = data
+ cdata = _gen_cdata_d_from_list(ol)
+ if len(cdata) > 0:
+ d['cdata'] = cdata
return d
if not isinstance(ol, list):
@@ -595,9 +738,9 @@
deltas = False
split = s.split('\n')
for i in range(len(split)):
- if '"deltas":' in split[i]:
+ if '"deltas":' in split[i] or '"cov":' in split[i] or '"grad":' in split[i]:
deltas = True
- elif deltas:
+ if deltas:
split[i] = split[i].replace('"[', '[').replace(']"', ']')
if split[i][-1] == ']':
deltas = False
@@ -730,16 +873,32 @@ If True, the output is a gzipped json. If False, the output is a json file.
def _gen_obsd_from_datad(d):
retd = {}
- retd['names'] = []
- retd['idl'] = []
- retd['deltas'] = []
- retd['is_merged'] = {}
+ if d:
+ retd['names'] = []
+ retd['idl'] = []
+ retd['deltas'] = []
+ retd['is_merged'] = {}
+ for ens in d:
+ for rep in ens['replica']:
+ retd['names'].append(rep['name'])
+ retd['idl'].append([di[0] for di in rep['deltas']])
+ retd['deltas'].append(np.array([di[1:] for di in rep['deltas']]))
+ retd['is_merged'][rep['name']] = rep.get('is_merged', False)
+ return retd
+
+ def _gen_covobsd_from_cdatad(d):
+ retd = {}
for ens in d:
- for rep in ens['replica']:
- retd['names'].append(rep['name'])
- retd['idl'].append([di[0] for di in rep['deltas']])
- retd['deltas'].append(np.array([di[1:] for di in rep['deltas']]))
- retd['is_merged'][rep['name']] = rep.get('is_merged', False)
+ retl = []
+ name = ens['id']
+ layouts = ens.get('layout', '1').strip()
+ layout = [int(ls.strip()) for ls in layouts.split(',') if len(ls) > 0]
+ cov = np.reshape(ens['cov'], layout)
+ grad = ens['grad']
+ nobs = len(grad[0])
+ for i in range(nobs):
+ retl.append({'name': name, 'cov': cov, 'grad': [g[i] for g in grad]})
+ retd[name] = retl
return retd
def get_Obs_from_dict(o):
@@ -748,11 +907,21 @@ If True, the output is a gzipped json. If False, the output is a json file.
raise Exception("layout is %s has to be 1 for type Obs." % (layouts), RuntimeWarning)
values = o['value']
- od = _gen_obsd_from_datad(o['data'])
+ od = _gen_obsd_from_datad(o.get('data', {}))
+ cd = _gen_covobsd_from_cdatad(o.get('cdata', {}))
+
+ if od:
+ ret = Obs([[ddi[0] + values[0] for ddi in di] for di in od['deltas']], od['names'], idl=od['idl'])
+ ret.is_merged = od['is_merged']
+ else:
+ ret = Obs([], [])
+ ret._value = values[0]
+ for name in cd:
+ co = cd[name][0]
+ ret._covobs[name] = Covobs(None, co['cov'], co['name'], grad=co['grad'])
+ ret.names.append(co['name'])
- ret = Obs([[ddi[0] + values[0] for ddi in di] for di in od['deltas']], od['names'], idl=od['idl'])
ret.reweighted = o.get('reweighted', False)
- ret.is_merged = od['is_merged']
ret.tag = o.get('tag', [None])[0]
return ret
@@ -760,14 +929,25 @@ If True, the output is a gzipped json. If False, the output is a json file.
layouts = o.get('layout', '1').strip()
layout = int(layouts)
values = o['value']
- od = _gen_obsd_from_datad(o['data'])
+ od = _gen_obsd_from_datad(o.get('data', {}))
+ cd = _gen_covobsd_from_cdatad(o.get('cdata', {}))
ret = []
taglist = o.get('tag', layout * [None])
for i in range(layout):
- ret.append(Obs([list(di[:, i] + values[i]) for di in od['deltas']], od['names'], idl=od['idl']))
+ if od:
+ ret.append(Obs([list(di[:, i] + values[i]) for di in od['deltas']], od['names'], idl=od['idl']))
+ ret[-1].is_merged = od['is_merged']
+ else:
+ ret.append(Obs([], []))
+ ret[-1]._value = values[i]
+ print('Created Obs with means= ', values[i])
+ for name in cd:
+ co = cd[name][i]
+ ret[-1]._covobs[name] = Covobs(None, co['cov'], co['name'], grad=co['grad'])
+ ret[-1].names.append(co['name'])
+
ret[-1].reweighted = o.get('reweighted', False)
- ret[-1].is_merged = od['is_merged']
ret[-1].tag = taglist[i]
return ret
@@ -776,14 +956,23 @@ If True, the output is a gzipped json. If False, the output is a json file.
layout = [int(ls.strip()) for ls in layouts.split(',') if len(ls) > 0]
N = np.prod(layout)
values = o['value']
- od = _gen_obsd_from_datad(o['data'])
+ od = _gen_obsd_from_datad(o.get('data', {}))
+ cd = _gen_covobsd_from_cdatad(o.get('cdata', {}))
ret = []
taglist = o.get('tag', N * [None])
for i in range(N):
- ret.append(Obs([di[:, i] + values[i] for di in od['deltas']], od['names'], idl=od['idl']))
+ if od:
+ ret.append(Obs([di[:, i] + values[i] for di in od['deltas']], od['names'], idl=od['idl']))
+ ret[-1].is_merged = od['is_merged']
+ else:
+ ret.append(Obs([], []))
+ ret[-1]._value = values[i]
+ for name in cd:
+ co = cd[name][i]
+ ret[-1]._covobs[name] = Covobs(None, co['cov'], co['name'], grad=co['grad'])
+ ret[-1].names.append(co['name'])
ret[-1].reweighted = o.get('reweighted', False)
- ret[-1].is_merged = od['is_merged']
ret[-1].tag = taglist[i]
return np.reshape(ret, layout)