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..e75a0c2e 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, + case get(?SA_DATA) of + 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, + 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} = + TempFunc(Temperature, + 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. + 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 + proper_gen_next:update_caches(reject), + %% calculate new temperature + {NewTemperature, AdjustedK} = + 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 shrinking + 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().