-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexperiments.py
100 lines (81 loc) · 4.29 KB
/
experiments.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
from numpy.linalg import norm
import time
from Infrastructure.utils import ex, create_factory, Dict, List, Callable, Vector, Matrix, DataLog, measure_time
from Infrastructure.enums import ExperimentType, LogFields
@ex.capture()
def _run_time_experiment(compared_solvers: List, data_matrix: Matrix, output_samples: Vector,
run_time_experiments_config):
all_logs: Dict = dict()
run_time_compared_data_sizes: List = run_time_experiments_config["run_time_compared_data_sizes"]
calc_transpose_dot_residuals: bool = run_time_experiments_config["calc_transpose_dot_residuals"]
for solver in compared_solvers:
error_raised: bool = False
log_fields: List = [LogFields.DataSize, LogFields.Coefficients, LogFields.Residuals,
LogFields.DurationInSeconds]
if calc_transpose_dot_residuals:
log_fields.append(LogFields.AtTimesErrors)
data_log = DataLog(log_fields)
coefficients_list = list()
residuals_list = list()
transpose_errors_list = list()
durations_list = list()
for data_size in run_time_compared_data_sizes:
try:
partial_data: Matrix = data_matrix[:data_size, :]
partial_samples: Vector = output_samples[:data_size]
solver_obj = solver(partial_data, partial_samples)
coefficients, duration = measure_time(solver_obj.fit)()
residuals: Vector = solver_obj.calc_residuals()
coefficients_list.append(coefficients.tolist())
residuals_list.append(norm(residuals))
if calc_transpose_dot_residuals:
transpose_errors_list.append(norm(partial_data.T.dot(residuals)))
durations_list.append(duration)
print(f'solver name={solver.__name__}, data size={data_size}, duration={duration}')
except IOError:
error_raised = True
continue
if not error_raised:
data_log.append(LogFields.DataSize, list(run_time_compared_data_sizes))
data_log.append(LogFields.Residuals, residuals_list)
if calc_transpose_dot_residuals:
data_log.append(LogFields.AtTimesErrors, transpose_errors_list)
data_log.append(LogFields.Coefficients, coefficients_list)
data_log.append(LogFields.DurationInSeconds, durations_list)
all_logs[solver.__name__] = data_log
return all_logs
@ex.capture(prefix="number_of_alphas_experiments_config")
def _number_of_alphas_experiment(compared_solvers: List, data_matrix: Matrix, output_samples: Vector,
alphas_range: List):
all_logs: Dict = dict()
for solver in compared_solvers:
error_raised: bool = False
data_log = DataLog([LogFields.Coefficients, LogFields.Residuals, LogFields.DurationInSeconds,
LogFields.AlphasCount])
coefficients_list = list()
residuals_list = list()
durations_list = list()
for current_alphas in alphas_range:
try:
solver_obj = solver(data_matrix, output_samples, n_alphas=current_alphas)
coefficients, duration = measure_time(solver_obj.fit)()
residuals: Vector = solver_obj.calc_residuals()
coefficients_list.append(coefficients.tolist())
residuals_list.append(norm(residuals))
durations_list.append(duration)
print(f'solver name={solver.__name__}, total alphas={current_alphas}, duration={duration}')
except IOError:
error_raised = True
continue
if not error_raised:
data_log.append(LogFields.AlphasCount, list(alphas_range))
data_log.append(LogFields.Residuals, residuals_list)
data_log.append(LogFields.Coefficients, coefficients_list)
data_log.append(LogFields.DurationInSeconds, durations_list)
all_logs[solver.__name__] = data_log
return all_logs
_experiment_type_to_method: Dict = {
ExperimentType.RunTimeExperiment: _run_time_experiment,
ExperimentType.NumberOfAlphasExperiment: _number_of_alphas_experiment
}
create_experiment: Callable = create_factory(_experiment_type_to_method, are_methods=True)