diff --git a/config.lua b/config.lua index 659adac..a128f83 100644 --- a/config.lua +++ b/config.lua @@ -1,7 +1,7 @@ local preset = rawget(_G, 'preset') preset = preset ~= nil and preset ~= '' and preset or 'ars' -local common_cfg = { +local defaults = { -- read-only modes: playable_mode = false, playback_mode = false, @@ -45,6 +45,7 @@ local common_cfg = { deviation = 1.0, unperturbed_trial = true, -- perform an extra trial without any noise. -- this is good for logging, so i'd recommend it. + epoch_trials = 50, graycode = false, -- for ARS. negate_trials = true, -- try pairs of normal and negated noise directions. -- AKA antithetic sampling. note that this doubles the number of trials. @@ -57,173 +58,23 @@ local common_cfg = { sigma_decay = 0.0, -- for SNES, xNES. } -local cfg -if preset == 'snes' then - - cfg = { - es = 'snes', - - log_fn = 'logs-snes.csv', - params_fn = 'params-snes.txt', - - starting_lives = 1, - min_time = 300, - timer_loser = 1.0, - - epoch_trials = 100, - negate_trials = false, - - deviation = 1.0, - min_refresh = 0.2, - - param_rate = 0.5, - sigma_rate = 0.1, - param_decay = 0.02, -- note: multiplied by its std, and param_rate. - sigma_decay = 0.01, -- note: multiplied by sigma_rate. - } - -elseif preset == 'snes2' then - - cfg = { - es = 'snes', - - log_fn = 'logs-snes2.csv', - params_fn = 'params-snes2.txt', - - start_big = true, - min_time = 300, - timer_loser = 1.0, - - score_multiplier = 0, - - init_zeros = true, - - reduce_tiles = true, - bias_out = false, - - deterministic = false, - - deviation = 0.5, - negate_trials = false, - min_refresh = 0.5, - - epoch_trials = 100, - - param_rate = 1.0, - sigma_rate = 0.01, - param_decay = 0.02, - sigma_decay = 0.01, - } - -elseif preset == 'xnes' then - - cfg = { - es = 'xnes', - - log_fn = 'logs-xnes.csv', - params_fn = 'params-xnes.txt', - - start_big = true, - min_time = 300, - timer_loser = 1.0, - - score_multiplier = 0, - - init_zeros = true, - - reduce_tiles = true, - bias_out = false, - - deterministic = false, - - deviation = 0.5, - negate_trials = false, - - epoch_trials = 50, - - param_rate = 1.0, - sigma_rate = 0.01, - covar_rate = 0.01, - } - -elseif preset == 'xnes2' then - - cfg = { - es = 'xnes', - - log_fn = 'logs-xnes2.csv', - params_fn = 'params-xnes2.txt', - - start_big = true, - min_time = 300, - timer_loser = 1.0, - - score_multiplier = 0, - - init_zeros = true, - - reduce_tiles = true, - bias_out = false, - - deterministic = false, - - deviation = 1.0, - negate_trials = true, --false, - - epoch_trials = 10, --50, - - param_rate = 0.5, - sigma_rate = 0.04, - covar_rate = 0.04, - param_decay = 0.004, - sigma_decay = 0.00128, - } - -elseif preset == 'ars' then - - cfg = { - es = 'ars', - epoch_top_trials = 20 * 2, - ars_lips = false, - - log_fn = 'logs-ars.csv', - params_fn = 'params-ars.txt', - - start_big = true, - min_time = 300, - timer_loser = 1.0, - - bias_out = false, - - deterministic = false, - - graycode = false, - deviation = 0.1, - negate_trials = false, - - epoch_trials = 25 * 2, - - param_rate = 1.0, - param_decay = 0.0025, - } - -elseif preset == 'play' then - - cfg = { - playable_mode = true, - } - -else - - error("invalid preset: "..tostring(preset)) +local presets = require("presets") +for _, cfg in pairs(presets) do + local parent = defaults + if cfg.parent ~= nil then + parent = presets[cfg.parent] + assert(parent, "no such parent preset: "..tostring(cfg.parent)) + end + setmetatable(cfg, {__index=parent}) end +local cfg = presets[preset] +assert(cfg, "invalid preset: "..tostring(preset)) + -- TODO: so, uhh.. -- what happens when playback_mode is true but unperturbed_trial is false? -setmetatable(cfg, {__index=common_cfg}) -- gets overridden later. - if cfg.es == 'ars' then if cfg.param_rate == nil then cfg.param_rate = cfg.base_rate end else @@ -232,9 +83,12 @@ end if cfg.sigma_rate == nil then cfg.sigma_rate = cfg.base_rate end if cfg.covar_rate == nil then cfg.covar_rate = cfg.sigma_rate end +local parent = getmetatable(cfg).__index + setmetatable(cfg, { __index = function(t, n) - if common_cfg[n] ~= nil then return common_cfg[n] end + if parent ~= nil and parent[n] ~= nil then return parent[n] end + if n == 'name' then return nil end if n == 'log_fn' then return nil end if n == 'params_fn' then return nil end if n == 'stats_fn' then return nil end diff --git a/presets.lua b/presets.lua new file mode 100644 index 0000000..01e7e90 --- /dev/null +++ b/presets.lua @@ -0,0 +1,190 @@ +-- these are all still very experimental, +-- but they should at least give you a head-start. +local presets = {} + +local function make_preset(cfg) + local name = cfg.name + if name ~= nil then + cfg.log_fn = cfg.log_fn or 'logs-'..name..'.csv' + cfg.params_fn = cfg.params_fn or 'params-'..name..'.txt' + end + presets[name] = cfg + return cfg +end + +make_preset{ + name = 'snes', + + es = 'snes', + + starting_lives = 1, + min_time = 300, + timer_loser = 1.0, + + epoch_trials = 100, + negate_trials = false, + + deviation = 1.0, + min_refresh = 0.2, + + param_rate = 0.5, + sigma_rate = 0.1, + param_decay = 0.02, + sigma_decay = 0.01, +} + +make_preset{ + name = 'snes2', + + es = 'snes', + + start_big = true, + min_time = 300, + timer_loser = 1.0, + + score_multiplier = 0, + + init_zeros = true, + + reduce_tiles = true, + bias_out = false, + + deterministic = false, + + deviation = 0.5, + negate_trials = false, + min_refresh = 0.5, + + epoch_trials = 100, + + param_rate = 1.0, + sigma_rate = 0.01, + param_decay = 0.02, + sigma_decay = 0.01, +} + +make_preset{ + name = 'xnes', + + es = 'xnes', + + start_big = true, + min_time = 300, + timer_loser = 1.0, + + score_multiplier = 0, + + init_zeros = true, + + reduce_tiles = true, + bias_out = false, + + deterministic = false, + + deviation = 0.5, + negate_trials = false, + + epoch_trials = 50, + + param_rate = 1.0, + sigma_rate = 0.01, + covar_rate = 0.01, +} + +make_preset{ + name = 'xnes2', + + es = 'xnes', + + log_fn = 'logs-xnes4.csv', + params_fn = 'params-xnes4.txt', + + start_big = true, + min_time = 300, + timer_loser = 1.0, + + score_multiplier = 0, + + init_zeros = true, + + reduce_tiles = true, + bias_out = false, + + deterministic = false, + + deviation = 1.0, + negate_trials = true, --false, + + epoch_trials = 10, --50, + + param_rate = 0.5, + sigma_rate = 0.04, + covar_rate = 0.04, + param_decay = 0.004, + sigma_decay = 0.00128, +} + +make_preset{ + name = 'xnes3', + + es = 'xnes', + + log_fn = 'logs-xnes5b.csv', + params_fn = 'params-xnes5b.txt', + + start_big = true, + timer_loser = 1.0, + + score_multiplier = 0, + + init_zeros = true, + + reduce_tiles = true, + bias_out = false, + + deterministic = false, + + deviation = 0.1207, + negate_trials = true, + + epoch_trials = 10, + + param_rate = 0.5, + sigma_rate = 0.16, + covar_rate = 0.04, + param_decay = 0.004, -- this should be ok now that it's mul by sigma. + sigma_decay = 0.00128, -- this might be okay... but watch out. +} + +make_preset{ + name = 'ars', + + es = 'ars', + epoch_top_trials = 20 * 2, + ars_lips = false, + + start_big = true, + min_time = 300, + timer_loser = 1.0, + + bias_out = false, + + deterministic = false, + + graycode = false, + deviation = 0.1, + negate_trials = false, + + epoch_trials = 25 * 2, + + param_rate = 1.0, + param_decay = 0.0025, +} + +make_preset{ + name = 'play', + + playable_mode = true, +} + +return presets