Skip to content

Commit 41d41c1

Browse files
convergence to projection for PDE, closes #36
2 parents dbb70b9 + 9690439 commit 41d41c1

9 files changed

Lines changed: 273 additions & 147 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,4 @@ pde_*D/
6262
*-data/
6363
*.pkl
6464

65+
data

setup.cfg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ pub =
6464
console_scripts =
6565
mud_examples = mud_examples.runner:run
6666
generate_poisson_data = mud_examples.poisson:run
67-
mud_run_inv = mud_examples.runner:run_inv
68-
mud_run_lin = mud_examples.runner:run_lin
67+
mud_run_inv = mud_examples.runner:run_monomial
68+
mud_run_lin = mud_examples.runner:run_linear
6969
mud_run_pde = mud_examples.runner:run_pde
7070
mud_run_ode = mud_examples.runner:run_ode
7171
mud_run_all = mud_examples.runner:run_all

src/mud_examples/experiments.py

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@
2121
_mpl_logger.setLevel(logging.WARNING)
2222

2323

24-
def experiment_measurements(fun, num_measurements,
25-
sd, num_trials, seed=21):
24+
def experiment_measurements(fun,
25+
num_measurements,
26+
sd,
27+
num_trials,
28+
seed=21):
2629
"""
2730
Fixed sensors, varying how much data is incorporated into the solution.
2831
"""
@@ -44,79 +47,84 @@ def experiment_measurements(fun, num_measurements,
4447
return experiments, solutions
4548

4649

47-
def experiment_equipment(fun, num_measure,
48-
sd_vals, num_trials,
49-
reference_value):
50+
def experiment_equipment(fun,
51+
num_measure,
52+
sd_vals,
53+
num_trials,
54+
seed=21):
5055
"""
5156
Fixed number of sensors, varying the quality of equipment.
5257
"""
53-
sd_err = []
54-
sd_var = []
58+
experiments = {}
59+
solutions = {}
5560
for sd in sd_vals:
5661
_logger.debug(f'Equipment Experiment. Std Dev: {sd}')
57-
temp_err = []
62+
discretizations = []
63+
estimates = []
5864
for t in range(num_trials):
65+
np.random.seed(seed + t)
5966
_d = fun(sd=sd, num_obs=num_measure)
6067
estimate = _d.estimate()
61-
temp_err.append(np.linalg.norm(estimate - reference_value))
62-
sd_err.append(np.mean(temp_err))
63-
sd_var.append(np.var(temp_err))
68+
discretizations.append(_d)
69+
estimates.append(estimate)
70+
experiments[sd] = discretizations
71+
solutions[sd] = estimates
6472

65-
return sd_err, sd_var
73+
return experiments, solutions
6674

6775

6876
def plot_experiment_equipment(tolerances, res, prefix, fsize=32, linewidth=5,
6977
title="Variance of MUD Error", save=True):
7078
print("Plotting experiments involving equipment differences...")
7179
plt.figure(figsize=(10, 10))
7280
for _res in res:
73-
_prefix, _in, _rm, _re = _res
81+
_example, _in, _rm, _re, _fname = _res
7482
regression_err_mean, slope_err_mean, \
7583
regression_err_vars, slope_err_vars, \
7684
sd_means, sd_vars, num_sensors = _re
7785
plt.plot(tolerances, regression_err_mean,
78-
label=f"{_prefix:10s} slope: {slope_err_mean:1.4f}",
86+
label=f"{_example.upper()} slope: {slope_err_mean:1.4f}",
7987
lw=linewidth)
8088
plt.scatter(tolerances, sd_means, marker='x', lw=20)
8189

8290
plt.yscale('log')
8391
plt.xscale('log')
8492
plt.Axes.set_aspect(plt.gca(), 1)
85-
plt.ylim(2E-3, 2E-2)
93+
# plt.ylim(2E-3, 2E-2)
8694
# plt.ylabel("Absolute Error", fontsize=fsize)
8795
plt.xlabel('Tolerance', fontsize=fsize)
8896
plt.legend()
8997
plt.title(f"Mean of MUD Error for N={num_sensors}", fontsize=1.25 * fsize)
9098
if save:
9199
fdir = ''.join(prefix.split('/')[::-1])
92-
check_dir(fdir)
100+
check_dir(f'figures/{_fname}/{fdir}')
93101
_logger.info("Saving equipment experiments: mean convergence.")
94-
plt.savefig(f'{prefix}_convergence_mud_std_mean.png',
102+
plt.savefig(f'figures/{_fname}/{prefix}_convergence_mud_std_mean.png',
95103
bbox_inches='tight')
96104
else:
97105
plt.show()
98106

99107
plt.figure(figsize=(10, 10))
100108
for _res in res:
101-
_prefix, _in, _rm, _re = _res
109+
_example, _in, _rm, _re, _fname = _res
102110
regression_err_mean, slope_err_mean, \
103111
regression_err_vars, slope_err_vars, \
104112
sd_means, sd_vars, num_sensors = _re
105113
plt.plot(tolerances, regression_err_vars,
106-
label=f"{_prefix:10s} slope: {slope_err_vars:1.4f}",
114+
label=f"{_example.upper()} slope: {slope_err_vars:1.4f}",
107115
lw=linewidth)
108116
plt.scatter(tolerances, sd_vars, marker='x', lw=20)
109117
plt.xscale('log')
110118
plt.yscale('log')
111-
plt.ylim(2E-5, 2E-4)
119+
# plt.ylim(2E-5, 2E-4)
112120
plt.Axes.set_aspect(plt.gca(), 1)
113121
# plt.ylabel("Absolute Error", fontsize=fsize)
114122
plt.xlabel('Tolerance', fontsize=fsize)
115123
plt.legend()
116124
plt.title(title, fontsize=1.25 * fsize)
117125
if save:
118126
_logger.info("Saving equipment experiments: variance convergence.")
119-
plt.savefig(f'{prefix}_convergence_mud_std_var.png',
127+
plt.savefig(f'figures/{_fname}/{prefix}_convergence_mud_std_var.png',
120128
bbox_inches='tight')
121129
else:
122130
plt.show()
@@ -125,25 +133,25 @@ def plot_experiment_equipment(tolerances, res, prefix, fsize=32, linewidth=5,
125133
def plot_experiment_measurements(res, prefix,
126134
fsize=32, linewidth=5,
127135
xlabel='Number of Measurements',
128-
save=True, legend=False):
136+
save=True, legend=True):
129137
print("Plotting experiments involving increasing # of measurements.")
130138
plt.figure(figsize=(10, 10))
131139
for _res in res:
132-
_prefix, _in, _rm, _re = _res
140+
_example, _in, _rm, _re, _fname = _res
133141
solutions = _in[-1]
134142
measurements = list(solutions.keys())
135143
regression_mean, slope_mean, \
136144
regression_vars, slope_vars, \
137145
means, variances = _rm
138146
plt.plot(measurements[:len(regression_mean)], regression_mean,
139-
label=f"{_prefix:4s} slope: {slope_mean:1.4f}",
147+
label=f"{_example.upper()} slope: {slope_mean:1.4f}",
140148
lw=linewidth)
141149
plt.scatter(measurements[:len(means)], means, marker='x', lw=20)
142150
plt.xscale('log')
143151
plt.yscale('log')
144152
plt.Axes.set_aspect(plt.gca(), 1)
145-
plt.ylim(0.9 * min(means), 1.3 * max(means))
146-
plt.ylim(2E-3, 2E-1)
153+
# plt.ylim(0.9 * min(means), 1.3 * max(means))
154+
# plt.ylim(2E-3, 2E-1)
147155
plt.xlabel(xlabel, fontsize=fsize)
148156
if legend:
149157
plt.legend(fontsize=fsize * 0.8)
@@ -152,20 +160,20 @@ def plot_experiment_measurements(res, prefix,
152160
plt.title(title, fontsize=1.25 * fsize)
153161
if save:
154162
fdir = '/'.join(prefix.split('/')[:-1])
155-
check_dir(fdir)
163+
check_dir(f'figures/{_fname}/{fdir}')
156164
_logger.info("Saving measurement experiments: mean convergence.")
157-
plt.savefig(f'{prefix}_convergence_obs_mean.png', bbox_inches='tight')
165+
plt.savefig(f'figures/{_fname}/{prefix}_convergence_obs_mean.png', bbox_inches='tight')
158166
else:
159167
plt.show()
160168

161169
plt.figure(figsize=(10, 10))
162170
for _res in res:
163-
_prefix, _in, _rm, _re = _res
171+
_example, _in, _rm, _re, _fname = _res
164172
regression_mean, slope_mean, \
165173
regression_vars, slope_vars, \
166174
means, variances = _rm
167175
plt.plot(measurements[:len(regression_vars)], regression_vars,
168-
label=f"{_prefix:4s} slope: {slope_vars:1.4f}",
176+
label=f"{_example.upper()} slope: {slope_vars:1.4f}",
169177
lw=linewidth)
170178
plt.scatter(measurements[:len(variances)], variances,
171179
marker='x', lw=20)
@@ -174,7 +182,7 @@ def plot_experiment_measurements(res, prefix,
174182
plt.Axes.set_aspect(plt.gca(), 1)
175183
# if not len(np.unique(variances)) == 1:
176184
# plt.ylim(0.9 * min(variances), 1.3 * max(variances))
177-
plt.ylim(5E-6, 5E-4)
185+
# plt.ylim(5E-6, 5E-4)
178186
plt.xlabel(xlabel, fontsize=fsize)
179187
if legend:
180188
plt.legend(fontsize=fsize * 0.8)
@@ -183,6 +191,6 @@ def plot_experiment_measurements(res, prefix,
183191
fontsize=1.25 * fsize)
184192
if save:
185193
_logger.info("Saving measurement experiments: variance convergence.")
186-
plt.savefig(f'{prefix}_convergence_obs_var.png', bbox_inches='tight')
194+
plt.savefig(f'figures/{_fname}/{prefix}_convergence_obs_var.png', bbox_inches='tight')
187195
else:
188196
plt.show()

src/mud_examples/ode.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,13 @@ def wrapper(num_obs, sd):
9191
raise ValueError("Unknown example type")
9292

9393
_logger.info("Increasing Measurements Quantity Study")
94-
experiments, solutions = experiment_measurements(num_measurements=measurements,
95-
sd=sigma,
96-
num_trials=num_trials,
97-
seed=seed,
98-
fun=wrapper)
94+
experiments, solutions = experiment_measurements(
95+
num_measurements=measurements,
96+
sd=sigma,
97+
num_trials=num_trials,
98+
seed=seed,
99+
fun=wrapper,
100+
)
99101

100102
means, variances = extract_statistics(solutions, lam_true)
101103
regression_mean, slope_mean = fit_log_linear_regression(measurements, means)
@@ -105,14 +107,16 @@ def wrapper(num_obs, sd):
105107

106108
num_sensors = num_measure
107109
if len(tolerances) > 1:
108-
109110
_logger.info("Increasing Measurement Precision Study")
110-
sd_means, sd_vars = experiment_equipment(num_trials=num_trials,
111-
num_measure=num_sensors,
112-
sd_vals=sd_vals,
113-
reference_value=lam_true,
114-
fun=wrapper)
115-
111+
experiments, solutions = experiment_equipment(
112+
sd_vals=sd_vals,
113+
num_measure=num_sensors,
114+
num_trials=num_trials,
115+
seed=seed,
116+
fun=wrapper,
117+
)
118+
119+
sd_means, sd_vars = extract_statistics(solutions, lam_true)
116120
regression_err_mean, slope_err_mean = fit_log_linear_regression(tolerances, sd_means)
117121
regression_err_vars, slope_err_vars = fit_log_linear_regression(tolerances, sd_vars)
118122
_re = (regression_err_mean, slope_err_mean,
@@ -125,7 +129,7 @@ def wrapper(num_obs, sd):
125129
_in = (lam, qoi, sensors, qoi_true, experiments, solutions)
126130
_rm = (regression_mean, slope_mean, regression_vars, slope_vars, means, variances)
127131
example_name = example.upper()
128-
res.append((example_name, _in, _rm, _re))
132+
res.append((example_name, _in, _rm, _re, ''))
129133

130134
# TODO check for existence of save directory, grab subset of measurements properly.
131135
plot_decay_solution(solutions, generate_decay_model, fsize=fsize,

0 commit comments

Comments
 (0)