Skip to content

Commit 2db8b6d

Browse files
author
James Spencer
committed
Make canonical analysis faster by minimising extending pandas objects.
1 parent f12b4ba commit 2db8b6d

File tree

2 files changed

+38
-35
lines changed

2 files changed

+38
-35
lines changed

tools/dmqmc/analyse_canonical.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,10 @@ def main(args):
7272
warnings.warn('Beta values in input files not consistent.')
7373

7474
if args.multi_sim:
75-
results = pd.concat([pyhande.canonical.estimates(m, d) for (m, d)
76-
in zip(metadata, data)])
75+
results = pd.DataFrame([pyhande.canonical.estimates(m, d) for (m, d)
76+
in zip(metadata, data)])
7777
else:
78-
results = pyhande.canonical.estimates(metadata[0], data)
78+
results = pd.DataFrame(pyhande.canonical.estimates(metadata[0], data)).T
7979

8080
try:
8181
float_fmt = '{0:-#.8e}'.format

tools/pyhande/pyhande/canonical.py

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def analyse_hf_observables(means, covariances, nsamples):
2121
2222
Returns
2323
-------
24-
results : :class:`pandas.DataFrame`
24+
results : :class:`pandas.Series`
2525
Averaged Hartree-Fock estimates along with error estimates.
2626
'''
2727

@@ -31,24 +31,24 @@ def analyse_hf_observables(means, covariances, nsamples):
3131
('U_HF', r'Tr(H\rho_HF)'),
3232
])
3333

34-
num = pd.DataFrame()
35-
trace = pd.DataFrame()
36-
results = pd.DataFrame()
37-
trace['mean'] = [means[r'Tr(\rho_HF)']]
38-
trace['standard error'] = (
39-
[np.sqrt(covariances[r'Tr(\rho_HF)'][r'Tr(\rho_HF)']/nsamples)])
34+
num = pd.Series({'mean': 0.0, 'standard error': 0.0})
35+
trace = pd.Series({
36+
'mean': means[r'Tr(\rho_HF)'],
37+
'standard error': np.sqrt(covariances[r'Tr(\rho_HF)'][r'Tr(\rho_HF)']/nsamples)
38+
})
39+
results = {}
4040

4141
for (k, v) in observables.items():
42-
num['mean'] = [means[v]]
43-
num['standard error'] = [np.sqrt(covariances[v][v]/nsamples)]
42+
num['mean'] = means[v]
43+
num['standard error'] = np.sqrt(covariances[v][v]/nsamples)
4444
cov_ab = covariances[v][r'Tr(\rho_HF)']
4545

4646
stats = pyblock.error.ratio(num, trace, cov_ab, nsamples)
4747

4848
results[k] = stats['mean']
4949
results[k+'_error'] = stats['standard error']
5050

51-
return results
51+
return pd.Series(results)
5252

5353

5454
def estimates(metadata, data):
@@ -64,7 +64,7 @@ def estimates(metadata, data):
6464
6565
Returns
6666
-------
67-
results : :class:`pandas.DataFrame`
67+
results : :class:`pandas.Series`
6868
Averaged estimates.
6969
'''
7070

@@ -95,31 +95,35 @@ def estimates(metadata, data):
9595
xm = data.sub(means, axis=1)
9696
covariances = 1.0/(1.0-w2) * xm.mul(w, axis=0).T.dot(xm)
9797

98-
results = pd.DataFrame()
9998
if 'beta' in metadata:
10099
# New, richer JSON-based metadata.
101-
results['Beta'] = [metadata['beta']]
100+
beta = metadata['beta']
102101
else:
103102
# Hope to find it in the input file...
104-
results['Beta'] = pyhande.legacy.extract_input(metadata, 'beta')
105-
# Free estimates contain no denominator so the error is
106-
# just the standard error.
107-
results['U_0'] = [means['U_0']]
108-
results['U_0_error'] = [np.sqrt(covariances['U_0']['U_0']/ncycles)]
109-
results['T_0'] = [means['<T>_0']]
110-
results['T_0_error'] = [np.sqrt(covariances['<T>_0']['<T>_0']/ncycles)]
111-
results['V_0'] = [means['<V>_0']]
112-
results['V_0_error'] = [np.sqrt(covariances['<V>_0']['<V>_0']/ncycles)]
103+
beta = pyhande.legacy.extract_input(metadata, 'beta')
104+
results = {
105+
'Beta': beta,
106+
# Free estimates contain no denominator so the error is
107+
# just the standard error.
108+
'U_0': means['U_0'],
109+
'U_0_error': np.sqrt(covariances['U_0']['U_0']/ncycles),
110+
'T_0': means['<T>_0'],
111+
'T_0_error': np.sqrt(covariances['<T>_0']['<T>_0']/ncycles),
112+
'V_0': means['<V>_0'],
113+
'V_0_error': np.sqrt(covariances['<V>_0']['<V>_0']/ncycles),
114+
}
113115
if 'N_ACC/N_ATT' in data.columns:
114-
results['N_ACC/N_ATT'] = [means['N_ACC/N_ATT']]
115-
results['N_ACC/N_ATT_error'] = (
116-
[np.sqrt(covariances['N_ACC/N_ATT']['N_ACC/N_ATT']/ncycles)]
117-
)
118116
if metadata['fermi_temperature']:
119-
beta = results['Beta'][0] / metadata['system']['ueg']['E_fermi']
117+
beta = results['Beta'] / metadata['system']['ueg']['E_fermi']
120118
else:
121-
beta = results['Beta'][0]
122-
correction = [metadata['free_energy_corr']]
119+
beta = results['Beta']
120+
correction = metadata['free_energy_corr']
121+
results.update({
122+
'N_ACC/N_ATT': means['N_ACC/N_ATT'],
123+
'N_ACC/N_ATT_error': (
124+
np.sqrt(covariances['N_ACC/N_ATT']['N_ACC/N_ATT']/ncycles)
125+
),
126+
})
123127
results['F_0'] = (
124128
(-1.0/beta)*np.log(results['N_ACC/N_ATT']) + correction
125129
)
@@ -135,11 +139,10 @@ def estimates(metadata, data):
135139
results['F_0_error']**2.0 -
136140
2.0*covariances['N_ACC/N_ATT']['<T>_0'] /
137141
(ncycles*results['N_ACC/N_ATT']*beta)))
142+
results = pd.Series(results)
138143

139144
# Take care of the correlation between numerator and denominator
140145
# in Hartree-Fock estimates.
141-
results = (
142-
results.join(analyse_hf_observables(means, covariances, ncycles))
143-
)
146+
results = results.append(analyse_hf_observables(means, covariances, ncycles))
144147

145148
return results

0 commit comments

Comments
 (0)