def descent_free(params, start_point: Point, game, balance=True): base_rtp, rtp, sdnew, hitrate, err_base_rtp, err_rtp, err_sdnew, err_hitrate = get_parameters_from_dict( params) print('started free descent') # print('start point base reels: ', start_point.base.reels) if rtp == -1: return [start_point, game] roots = initial_free_distributions(game, start_point.base.frequency, start_point.free.frequency, params, base_reels=start_point.base.reels) finded_min = Point(second_frequency=roots[0].base.frequency, main_frequency=roots[0].free.frequency, game=game, main_type='free', base_reels=start_point.base.reels) finded_min.base.reels = start_point.base.reels value_list = [] for root in roots: print(root.free.frequency, ' value is ', root.value, 'base_rtp, rtp, sdnew, hitrate :', root.base_rtp, root.rtp, root.sdnew, root.hitrate) value_list = value_list + [root.value] index_list = list(range(len(value_list))) double_bubble(value_list, index_list) print('assuming base rtp, rtp, sd ', base_rtp, rtp, sdnew) print('assuming errors for base rtp, rtp, sd ', err_base_rtp, err_rtp, err_sdnew) index_list.remove(0) index_list = [0] + index_list for index in index_list: print('TRYING POINT', roots[index].free.frequency, ' value is ', roots[index].value, 'base_rtp, rtp, sdnew, hitrate :', roots[index].base_rtp, roots[index].rtp, roots[index].sdnew, roots[index].hitrate) root = roots[index] currentScale = 0 while currentScale < scaleLimit: number_of_groups = len(game.free.wildlist) + len(game.free.ewildlist) + \ len(game.free.scatterlist) + 1 max_number_of_groups = len(game.base.symbol) while number_of_groups <= max_number_of_groups: temp_group = Group(game, 'free', root, number_of_groups, params, rebalance=balance, sd_flag=False, base_reels=start_point.base.reels) print('groups ', temp_group.split.groups) temp_group.print_group('free') finded_min = temp_group.find_best_point() if finded_min != -1: if finded_min.value < 1: print('ending with ', finded_min.value) print('base ', finded_min.base_rtp) print('rtp ', finded_min.rtp) print('sdnew ', finded_min.sdnew) print('hitrate ', finded_min.hitrate) root = copy.deepcopy(finded_min) print(root.free.frequency) finded_min.fill_point_metric(params, base=False, sd_flag=False) finded_min.base.reels = copy.deepcopy( start_point.base.reels) return [finded_min, game] else: print('path ', finded_min.value) root = copy.deepcopy(finded_min) else: if 0.5 * max_number_of_groups < number_of_groups < max_number_of_groups: number_of_groups = max_number_of_groups else: number_of_groups += 1 root.scaling() currentScale += 1 print('SCALING ', currentScale) print('Free done') finded_min.fill_point(game, params, base=False, sd_flag=True, base_shuffle=False, free_shuffle=False) finded_min.base.reels = copy.deepcopy(start_point.base.reels) return [finded_min, game]
def descent_base(params, game, balance=True, start_point=None): base_rtp, rtp, sdnew, hitrate, err_base_rtp, err_rtp, err_sdnew, err_hitrate = get_parameters_from_dict( params) start_game = copy.deepcopy(game) out = sm.get_scatter_frequency(game, hitrate, err_hitrate) print('Generated scatter frequency') if out == -1 and hitrate != -1: raise Exception( 'Game rules not contain freespins, but you try to fit HitRate. Please, set it -1' ) elif out == -1: out = sm.OutResult(game.base.scatterlist) out.add_symbols(game.base.symbol) blocked_scatters = [] for scatter_id in game.base.scatterlist: if max(game.base.symbol[scatter_id].scatter) > 0: blocked_scatters.append(scatter_id) print('started base descent') game.base.create_simple_num_comb(game.window, game.line) game.free.create_simple_num_comb(game.window, game.line) print('created_num_comb') roots = [] if start_point is None: roots = initial_base_distributions(game, out, params) else: roots.append(start_point) finded_min = Point(main_frequency=roots[0].base.frequency, second_frequency=roots[0].free.frequency, game=game, main_type='base') print('INITIAL POINTS, THEIR DISTRIBUTIONS, VALUES AND PARAMETERS:') value_list = [] for root in roots: # root.fillVal(base_rtp, rtp, sdnew, err_base_rtp, err_rtp, err_sdnew) print(root.base.frequency, ' value is ', root.value, 'base_rtp, rtp, sdnew, hitrate :', root.base_rtp, root.rtp, root.sdnew, root.hitrate) value_list = value_list + [root.value] index_list = list(range(len(value_list))) double_bubble(value_list, index_list) print('assuming base rtp, rtp, sd ', base_rtp, rtp, sdnew) print('assuming errors for base rtp, rtp, sd ', err_base_rtp, err_rtp, err_sdnew) # print(value_list) index_list.remove(0) index_list = [0] + index_list for index in index_list: print('TRYING POINT', roots[index].base.frequency, ' value is ', roots[index].value, 'base_rtp, rtp, sdnew, hitrate :', roots[index].base_rtp, roots[index].rtp, roots[index].sdnew, roots[index].hitrate) root = roots[index] currentScale = 0 while currentScale < scaleLimit: number_of_groups = len(game.base.wildlist) + len(game.base.ewildlist) + \ len(game.base.scatterlist) - len(blocked_scatters) + 1 max_number_of_groups = len( game.base.symbol) - len(blocked_scatters) while number_of_groups <= max_number_of_groups: temp_group = Group(game, 'base', root, number_of_groups, params, rebalance=balance, sd_flag=False) print('groups ', temp_group.split.groups) temp_group.print_group() finded_min = temp_group.find_best_point() if finded_min != -1: if finded_min.value < 1: print('ending with ', finded_min.value) print('base ', finded_min.base_rtp) print('rtp ', finded_min.rtp) print('sdnew ', finded_min.sdnew) print('hitrate ', finded_min.hitrate) root = copy.deepcopy(finded_min) print(root.base.frequency) game.base.reels = copy.deepcopy(finded_min.base.reels) game.free.reels = copy.deepcopy(finded_min.free.reels) finded_min.fill_point_metric(params) return [finded_min, game] else: print('path ', finded_min.value) root = copy.deepcopy(finded_min) else: if 0.5 * max_number_of_groups < number_of_groups < max_number_of_groups: number_of_groups = max_number_of_groups else: number_of_groups += 1 root.scaling() currentScale += 1 print('SCALING ', currentScale) print('Base done') if finded_min == -1: return [start_point, start_game] finded_min.fill_point(game, params, base=False, sd_flag=True, base_shuffle=False, free_shuffle=False) return [finded_min, game]