-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoptimization.py
More file actions
56 lines (48 loc) · 2.04 KB
/
Copy pathoptimization.py
File metadata and controls
56 lines (48 loc) · 2.04 KB
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
"""Optimization of progress measure parameter values for a given scenario."""
import inspect
import optuna as opt
import progress_measures as pm
import evaluation_metrics as em
import config as cf
import models
def evaluate_single_measure(scenario, sequences, measure):
eval_specs = cf.get_eval_specs(scenario)
durations = {skill: [measure.steps_to_mastery(seq)
for seq in sequences[skill]]
for skill in cf.SKILLS}
metric_values = [metric_fun(durations, eval_specs)
for metric_fun in em.METRICS]
return em.mellow_max(metric_values)
def optimize(scenario, pm_class, n_trials=300, rep=600):
def objective(trial):
for name, type_str, low, high in pm_class.optimization_params:
if type_str == "int":
trial.suggest_int(name, low, high)
elif type_str == "float":
trial.suggest_float(name, low, high)
if "guess_chance" in inspect.signature(pm_class.__init__).parameters:
measure = pm_class(guess_chance=scenario.guess_chance, **trial.params)
else:
measure = pm_class( **trial.params)
return evaluate_single_measure(scenario, sequences, measure)
opt.logging.disable_default_handler()
limit = cf.get_attempts_limit(scenario)
sequences = {skill: models.get_answer_sequences(scenario, skill, rep, limit)
for skill in cf.SKILLS}
study = opt.create_study()
study.optimize(objective, n_trials=n_trials)
return study.best_params, study.best_value
def optimize_all(scenario):
for pm_class in [
pm.ProgressMeasureTC,
pm.ProgressMeasureNCC,
pm.ProgressMeasureTOW,
pm.ProgressMeasureEMA,
pm.ProgressMeasureVSLinear,
pm.ProgressMeasureVSHMM
]:
print("Processing", pm_class.__name__)
params, value = optimize(scenario, pm_class)
print("\t", "best value of optimization metric:", round(value, 3))
for param in params:
print("\t", param, "=", round(params[param], 3))