From 8016363a8dc52fe61a03da834f489c5c6582461c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20L=C3=B6scher?= Date: Wed, 27 Jun 2018 14:06:22 +0200 Subject: [PATCH 1/2] fixes an issue where strategies could not be cleaned up --- src/proper.erl | 2 +- src/proper_sa.erl | 90 ++++++++++++++++++++++--------------------- src/proper_target.erl | 8 ++-- 3 files changed, 52 insertions(+), 48 deletions(-) diff --git a/src/proper.erl b/src/proper.erl index 45238965..6b50a9ee 100644 --- a/src/proper.erl +++ b/src/proper.erl @@ -1366,7 +1366,7 @@ run({exists, TMap, Prop, Not}, #ctx{mode = new} = Ctx, SR = perform_search(Steps, Target, Prop, Ctx, Opts, Not), put('$size', BackupSize), Print("]", []), - %% proper_target:cleanup_strategy(), TODO: why does this not work? + proper_target:cleanup_strategy(), SR; run({exists, TMap, Prop, Not}, #ctx{mode = try_shrunk, bound = []}, Opts) -> run({exists, TMap, Prop, Not}, #ctx{mode = new, bound = []}, Opts#opts{output_fun = fun (_, _) -> ok end}); diff --git a/src/proper_sa.erl b/src/proper_sa.erl index 221825c1..3ebed1b8 100644 --- a/src/proper_sa.erl +++ b/src/proper_sa.erl @@ -252,49 +252,53 @@ retrieve_target(Key) -> %% @private -spec update_global_fitness(proper_target:fitness()) -> 'ok'. update_global_fitness(Fitness) -> - Data = get(?SA_DATA), - K_CURRENT = (Data#sa_data.k_current), - K_MAX = (Data#sa_data.k_max), - Temperature = Data#sa_data.temperature, - NewData = case (Data#sa_data.last_energy =:= null) - orelse - (Data#sa_data.p)(Data#sa_data.last_energy, - Fitness, - Temperature) of - true -> - %% accept new state - proper_gen_next:update_caches(accept), - NewState = update_all_targets(Data#sa_data.state), - %% calculate new temperature - {NewTemperature, AdjustedK} = - (Data#sa_data.temp_func)(Temperature, - Data#sa_data.last_energy, - Fitness, - K_MAX, - K_CURRENT, - true), - Data#sa_data{state = NewState, - last_energy = Fitness, - last_update = 0, - k_current = AdjustedK, - temperature = NewTemperature}; - false -> - %% reject new state - %% calculate new temperature - proper_gen_next:update_caches(reject), - {NewTemperature, AdjustedK} = - (Data#sa_data.temp_func)(Temperature, - Data#sa_data.last_energy, - Fitness, - K_MAX, - K_CURRENT, - false), - Data#sa_data{last_update = Data#sa_data.last_update +1, - k_current = AdjustedK, - temperature = NewTemperature} - end, - put(?SA_DATA, NewData), - ok. + case get(?SA_DATA) of + Data = #sa_data{} -> + K_CURRENT = (Data#sa_data.k_current), + K_MAX = (Data#sa_data.k_max), + Temperature = Data#sa_data.temperature, + NewData = case (Data#sa_data.last_energy =:= null) + orelse (Data#sa_data.p)(Data#sa_data.last_energy, + Fitness, + Temperature) of + true -> + %% accept new state + proper_gen_next:update_caches(accept), + NewState = update_all_targets(Data#sa_data.state), + %% calculate new temperature + {NewTemperature, AdjustedK} = + (Data#sa_data.temp_func)(Temperature, + Data#sa_data.last_energy, + Fitness, + K_MAX, + K_CURRENT, + true), + Data#sa_data{state = NewState, + last_energy = Fitness, + last_update = 0, + k_current = AdjustedK, + temperature = NewTemperature}; + false -> + %% reject new state + %% calculate new temperature + proper_gen_next:update_caches(reject), + {NewTemperature, AdjustedK} = + (Data#sa_data.temp_func)(Temperature, + Data#sa_data.last_energy, + Fitness, + K_MAX, + K_CURRENT, + false), + Data#sa_data{last_update = Data#sa_data.last_update +1, + k_current = AdjustedK, + temperature = NewTemperature} + end, + put(?SA_DATA, NewData), + ok; + _ -> + %% no search strategy or shrining + ok + end. %% update the last generated value with the current generated value %% (hence accepting new state) diff --git a/src/proper_target.erl b/src/proper_target.erl index 44f39c28..97da1322 100644 --- a/src/proper_target.erl +++ b/src/proper_target.erl @@ -137,7 +137,7 @@ set_fitness(Fitness) -> -spec strategy() -> strategy(). strategy() -> - get('$strategy'). + get('$search_strategy'). strategy(Strat) -> case Strat of @@ -156,13 +156,13 @@ strategy(Strat) -> -spec use_strategy(strategy(), proper:setup_opts()) -> proper:outer_test(). use_strategy(Strat, Opts) -> Strategy = strategy(Strat), - put('$strategy', Strategy), + put('$search_strategy', Strategy), Strategy:init_strategy(Opts). -spec init_strategy(strategy()) -> ok. init_strategy(Strat) -> Strategy = strategy(Strat), - put('$strategy', Strategy), + put('$search_strategy', Strategy), Steps = get('$search_steps'), OutputFun = fun(_, _) -> ok end, Strategy:init_strategy(#{numtests=>Steps, output_fun=>OutputFun}). @@ -171,7 +171,7 @@ init_strategy(Strat) -> -spec cleanup_strategy() -> ok. cleanup_strategy() -> (strategy()):cleanup(), - erase('$strategy'), ok. + ok. %% @private -spec get_target(key(), tmap()) -> target(). From e5289afe9579d96e894b41c363e2cbe3faaba5bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20L=C3=B6scher?= Date: Wed, 27 Jun 2018 14:29:16 +0200 Subject: [PATCH 2/2] code cleanup --- src/proper_sa.erl | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/proper_sa.erl b/src/proper_sa.erl index 3ebed1b8..e75a0c2e 100644 --- a/src/proper_sa.erl +++ b/src/proper_sa.erl @@ -253,10 +253,10 @@ retrieve_target(Key) -> -spec update_global_fitness(proper_target:fitness()) -> 'ok'. update_global_fitness(Fitness) -> case get(?SA_DATA) of - Data = #sa_data{} -> - K_CURRENT = (Data#sa_data.k_current), - K_MAX = (Data#sa_data.k_max), - Temperature = Data#sa_data.temperature, + Data = #sa_data{k_current = K_CURRENT, + k_max = K_MAX, + temperature = Temperature, + temp_func = TempFunc} -> NewData = case (Data#sa_data.last_energy =:= null) orelse (Data#sa_data.p)(Data#sa_data.last_energy, Fitness, @@ -267,12 +267,12 @@ update_global_fitness(Fitness) -> NewState = update_all_targets(Data#sa_data.state), %% calculate new temperature {NewTemperature, AdjustedK} = - (Data#sa_data.temp_func)(Temperature, - Data#sa_data.last_energy, - Fitness, - K_MAX, - K_CURRENT, - true), + TempFunc(Temperature, + Data#sa_data.last_energy, + Fitness, + K_MAX, + K_CURRENT, + true), Data#sa_data{state = NewState, last_energy = Fitness, last_update = 0, @@ -280,23 +280,23 @@ update_global_fitness(Fitness) -> temperature = NewTemperature}; false -> %% reject new state - %% calculate new temperature proper_gen_next:update_caches(reject), + %% calculate new temperature {NewTemperature, AdjustedK} = - (Data#sa_data.temp_func)(Temperature, - Data#sa_data.last_energy, - Fitness, - K_MAX, - K_CURRENT, - false), - Data#sa_data{last_update = Data#sa_data.last_update +1, + TempFunc(Temperature, + Data#sa_data.last_energy, + Fitness, + K_MAX, + K_CURRENT, + false), + Data#sa_data{last_update = Data#sa_data.last_update + 1, k_current = AdjustedK, temperature = NewTemperature} end, put(?SA_DATA, NewData), ok; _ -> - %% no search strategy or shrining + %% no search strategy or shrinking ok end.