Example #1
0
def test_uniques_nba():
    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
    )
    second_roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        optimizer_settings=OptimizerSettings(existing_rosters=[roster], ),
    )
    third_roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        optimizer_settings=OptimizerSettings(
            existing_rosters=[roster],
            uniques=2,
        ),
    )

    players = roster.sorted_players()
    second_players = second_roster.sorted_players()
    third_players = third_roster.sorted_players()
    crossover_a = list(set(players).intersection(second_players))
    crossover_b = list(set(players).intersection(third_players))
    ntools.assert_equal(len(crossover_a),
                        rules.DK_NBA_RULE_SET.roster_size - 1)
    ntools.assert_equal(len(crossover_b),
                        rules.DK_NBA_RULE_SET.roster_size - 2)
Example #2
0
def test_no_opposing_def_dk_nfl():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )

    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(locked=['Bengals']),
        verbose=True)

    for p in roster.players:
        if p.pos in rules.DK_NFL_RULE_SET.offensive_positions:
            ntools.assert_not_equal(p.team, 'CIN')

    # force impossible lineup
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(locked=['Bengals', 'Ryan Fitzpatrick']),
        verbose=True)

    ntools.assert_equal(roster, None)
Example #3
0
def test_no_opposing_def_fd_nfl():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=fd_nfl_salary_file,
        game=rules.FAN_DUEL,
    )
    roster = run(
        rule_set=rules.FD_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(locked=['Jacksonville Jaguars']),
        verbose=True)

    ntools.assert_not_equal(roster, None)

    for p in roster.players:
        if p.pos in rules.DK_NFL_RULE_SET.offensive_positions:
            ntools.assert_not_equal(p.team, 'IND')

    # force impossible lineup
    roster = run(
        rule_set=rules.FD_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(
            locked=['Eric Ebron', 'Jacksonville Jaguars']),
        verbose=True)

    ntools.assert_equal(roster, None)
Example #4
0
def test_force_combo():
    # no combo
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 player_settings=PlayerPoolSettings(locked=['Sam Bradford'], ),
                 optimizer_settings=OptimizerSettings(
                     stack_team='NE',
                     stack_count=5,
                 ))
    qb = roster.sorted_players()[0]
    team_count = len([x for x in roster.sorted_players() if x.team == qb.team])
    ntools.assert_equals(team_count, 1)

    # QB/WR combo
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 optimizer_settings=OptimizerSettings(force_combo=True, ))
    qb = roster.sorted_players()[0]
    ntools.assert_equal(qb.pos, 'QB')
Example #5
0
def test_te_combo():
    # use lock and ban to make a non-globally optimal QB/TE combo optimal
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(
            force_combo=True,
            combo_allow_te=True,
        ),
        constraints=LineupConstraints(
            banned=['Kellen Davis'],
            locked=['Philip Rivers'],
        ),
        verbose=True,
    )
    qb = roster.sorted_players()[0]
    ntools.assert_equal(qb.pos, 'QB')
    team_count = len([
        x for x in roster.sorted_players()
        if x.team == qb.team and x.pos == 'TE'
    ])
    ntools.assert_equals(team_count, 1)

    # make sure WR/QB still works
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(
            force_combo=True,
            combo_allow_te=True,
        ),
        constraints=LineupConstraints(locked=['Andrew Luck'], ),
        verbose=True,
    )
    qb = roster.sorted_players()[0]
    ntools.assert_equal(qb.pos, 'QB')
    team_count = len([
        x for x in roster.sorted_players()
        if x.team == qb.team and x.pos == 'WR'
    ])
    ntools.assert_equals(team_count, 1)
Example #6
0
def test_soccer_dk_no_opp_d():
    player_pool = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_SOCCER_RULE_SET,
        player_pool=player_pool,
        constraints=LineupConstraints(
            locked=['Maxi Gomez'],
        ),
        optimizer_settings=OptimizerSettings(
            no_offense_against_defense=False,
        ),
        verbose=True,
    )
    cel_off_players = [
        p for p in roster.players if p.team == 'CEL'
        and p.pos in ['M', 'F']
    ]
    lgn_d_players = [
        p for p in roster.players if p.team == 'LGN'
        and p.pos in ['D', 'GK']
    ]
    ntools.assert_equal(len(cel_off_players), 2)
    ntools.assert_equal(len(lgn_d_players), 2)

    roster = run(
        rule_set=rules.DK_SOCCER_RULE_SET,
        player_pool=player_pool,
        constraints=LineupConstraints(
            locked=['Maxi Gomez'],
        ),
        optimizer_settings=OptimizerSettings(
            no_offense_against_defense=True,
        ),
        verbose=True,
    )
    cel_off_players = [
        p for p in roster.players if p.team == 'CEL'
        and p.pos in ['M', 'F']
    ]
    lgn_d_players = [
        p for p in roster.players if p.team == 'LGN'
        and p.pos in ['D', 'GK']
    ]
    ntools.assert_equal(len(cel_off_players), 2)
    ntools.assert_equal(len(lgn_d_players), 0)
Example #7
0
def run_multi(
    iterations: int,
    rule_set: RuleSet,
    player_pool: list,
    constraints: LineupConstraints = LineupConstraints(),
    player_settings: PlayerPoolSettings = PlayerPoolSettings(),
    optimizer_settings: OptimizerSettings = OptimizerSettings(),
    verbose=False,
    exposure_bounds: List[dict] = list(),
    exposure_random_seed=None,
) -> [List[Roster], list]:
    # set the random seed globally for random lineup exposure
    random.seed(exposure_random_seed)

    rosters = []
    for _ in range(0, iterations):
        exposure_dict = get_exposure_args(
            existing_rosters=optimizer_settings.existing_rosters,
            exposure_bounds=exposure_bounds,
            n=iterations,
            use_random=bool(exposure_random_seed),
            random_seed=exposure_random_seed,
        )

        roster = run(
            rule_set=rule_set,
            player_pool=player_pool,
            optimizer_settings=optimizer_settings,
            player_settings=player_settings,
            exposure_dict=exposure_dict,
            constraints=constraints,
            verbose=verbose,
        )
        if roster:
            optimizer_settings.existing_rosters += [roster]

        if roster:
            rosters.append(roster)
        else:
            break

        # clear ban/lock to reset exposure between iterations
        reset_player_ban_lock(player_pool)

    exposure_diffs = {}

    if rosters and verbose:
        print(get_exposure_table(rosters, exposure_bounds))
        print()
        print(get_exposure_matrix(rosters))
        print()

        exposure_diffs = check_exposure(rosters, exposure_bounds)
        for n, d in exposure_diffs.items():
            if d < 0:
                print('{} is UNDER exposure by {} lineups'.format(n, d))
            else:
                print('{} is OVER exposure by {} lineups'.format(n, d))

    return rosters, exposure_diffs
def test_if_one_then_two():
    mock_nba_pool = construct_pool()

    # Base case
    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        verbose=True,
    )
    names = {p.name for p in roster.players}
    ntools.assert_equal(
        True, 'A1' in names and 'A4' not in names and 'A9' not in names)
    settings = OptimizerSettings(custom_rules=[
        # Always play A1 with A9 and A4
        CustomRule(group_a=lambda p: p.name == 'A1',
                   group_b=lambda p: p.name == 'A9' or p.name == 'A4')
    ])

    # TODO - add test where A1 is not in optimized lineup
    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        verbose=True,
        optimizer_settings=settings,
    )
    names = {p.name for p in roster.players}

    # Without this rule, A4 and A9 would never appear in the optimized
    # lineup. Both have a 0 point projection.
    ntools.assert_equal(True, 'A1' in names and 'A9' in names
                        and 'A4' in names)
Example #9
0
def test_custom_stack():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(stacks=[
            Stack(
                team='NE',
                count=5,
                stack_lock_pos=['QB'],
                stack_eligible_pos=['WR'],
            )
        ]),
        verbose=True,
    )
    ne_players_count = len(
        [p for p in roster.sorted_players() if p.team == 'NE'])
    ntools.assert_equals(5, ne_players_count)
    ne_def = len([
        p for p in roster.sorted_players() if p.team == 'NE' and p.pos == 'DST'
    ])
    ntools.assert_equals(ne_def, 0)
    wides = len([
        p for p in roster.sorted_players() if p.team == 'NE' and p.pos == 'WR'
    ])
    ntools.assert_equals(wides, 4)
def test_never_two():
    mock_nba_pool = construct_pool()

    # Base case
    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        verbose=True,
    )
    names = {p.name for p in roster.players}
    ntools.assert_equal(True, 'A101' in names and 'A100' in names)

    # Never play two players together
    settings = OptimizerSettings(custom_rules=[
        CustomRule(group_a=lambda p: p,
                   group_b=lambda p: p.name == 'A100' or p.name == 'A101',
                   comparison=lambda sum, a, b: sum(b) <= 1)
    ])

    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        verbose=True,
        optimizer_settings=settings,
    )
    names = {p.name for p in roster.players}

    # Without this rule, A4 and A9 would never appear in the optimized
    # lineup. Both have a 0 point projection.
    ntools.assert_equal(True, 'A101' not in names and 'A100' in names)
Example #11
0
def run_multi(
    iterations: int,
    rule_set: RuleSet,
    player_pool: list,
    player_settings=PlayerPoolSettings(),
    optimizer_settings=OptimizerSettings(),
    verbose=False,
    exposure_bounds=None,
    exposure_random_seed=None,
) -> [List[Roster], list]:

    # set the random seed globally for random lineup exposure
    if exposure_random_seed:
        random.seed(exposure_random_seed)

    rosters = []
    for _ in range(0, iterations):
        if exposure_bounds:
            exposure_dct = get_exposure_args(
                existing_rosters=optimizer_settings.existing_rosters,
                exposure_bounds=exposure_bounds,
                n=iterations,
                use_random=bool(exposure_random_seed),
                random_seed=exposure_random_seed,
            )
            player_settings.banned = exposure_dct['banned']
            player_settings.locked = exposure_dct['locked']

        roster = run(
            rule_set=rule_set,
            player_pool=player_pool,
            optimizer_settings=optimizer_settings,
            player_settings=player_settings,
            verbose=verbose,
        )
        if roster:
            optimizer_settings.existing_rosters += [roster]

        if roster:
            rosters.append(roster)
        else:
            break

    exposure_diffs = {}

    if rosters and verbose:
        print(get_exposure_table(rosters, exposure_bounds))
        print()
        print(get_exposure_matrix(rosters))
        print()

        exposure_diffs = check_exposure(rosters, exposure_bounds)
        for n, d in exposure_diffs.items():
            if d < 0:
                print('{} is UNDER exposure by {} lineups'.format(n, d))
            else:
                print('{} is OVER exposure by {} lineups'.format(n, d))

    return rosters, exposure_diffs
Example #12
0
def test_custom_rules():
    # Minimum stack size
    custom_rules = []
    player_pool = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        game=rules.DRAFT_KINGS,
        ruleset=rules.DK_MLB_RULE_SET,
    )
    for p in player_pool:
        if p.team == 'ATL' and p.pos == '1B':
            p.proj = 1_000

    def comp(sum, a, b):
        return sum(b) >= sum(a) + 2

    # It appears to me closures do not work with ortools
    # (ex. passing p.team == t)
    custom_rules.append(
        CustomRule(
            # Given 1B in optimized lineup
            group_a=lambda p:
            p.pos == '1B' and p.team == 'ATL',

            # Ensure the stack is four players
            group_b=lambda p:
            '1B' not in p.pos and p.team == 'ATL',  # batters only

            comparison=comp,
        )
    )
    custom_rules.append(
        CustomRule(
            # Given 1B in optimized lineup
            group_a=lambda p:
            p.pos == '1B' and p.team == 'BOS',

            # Ensure the stack is four players
            group_b=lambda p:
            '1B' not in p.pos and p.team == 'BOS',  # batters only

            comparison=comp,
        )
    )

    settings = OptimizerSettings(
        custom_rules=custom_rules
    )

    roster = run(
        rule_set=rules.DK_MLB_RULE_SET,
        player_pool=player_pool,
        verbose=True,
        optimizer_settings=settings,
    )
    team_for_first = [p for p in roster.players if p.pos == '1B'][0].team
    total = len([p for p in roster.players
                 if p.team == team_for_first and 'P' not in p.pos])
    assert total > 3, f"{total} below 4"
Example #13
0
def test_force_combo():
    # no combo
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(
            stacks=[Stack(team='NE', count=5)]),
        constraints=LineupConstraints(locked=['Sam Bradford'], ),
    )
    qb = roster.sorted_players()[0]
    team_count = len([x for x in roster.sorted_players() if x.team == qb.team])
    ntools.assert_equals(team_count, 1)

    # QB/WR combo
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(
        rule_set=rules.DK_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(force_combo=True, ),
        constraints=LineupConstraints(banned=['Ryan Fitzpatrick']),
        verbose=True,
    )
    qb = roster.sorted_players()[0]
    ntools.assert_equal(qb.pos, 'QB')

    wr_team_count = len([
        x for x in roster.sorted_players()
        if x.team == qb.team and x.pos == 'WR'
    ])
    ntools.assert_equals(wr_team_count, 1)

    te_team_count = len([
        x for x in roster.sorted_players()
        if x.team == qb.team and x.pos == 'TE'
    ])
    ntools.assert_equals(te_team_count, 0)
Example #14
0
    def _compile_params(self):

        if self.stacks:
            optimizers = OptimizerSettings(
                stacks=[
                    Stack(
                        team=good['team'],
                        count=good['count'],
                        stack_lock_pos=good['lock'],
                        stack_eligible_pos=good['eligible']
                    )
                    for good in self.stacks
                ],
            )
        else:
            optimizers = OptimizerSettings()

        exposures = self.exposures

        groups = []

        if self.targets:
            for k in self.targets.keys():
                groups.append(
                    [
                        self.targets[k]['players'],
                        (
                            self.targets[k]['lower'],
                            self.targets[k]['upper']
                        )
                    ]
                )

        if self.banned or groups:
            constraints = LineupConstraints(
                banned=self.banned,
                groups=groups
            )
        else:
            constraints = LineupConstraints()

        return constraints, exposures, optimizers
Example #15
0
def test_nfl_dk_showdown_mock():
    mock_dk_pool = _build_mock_player_pool()

    roster = run(rule_set=rules.DK_NFL_SHOWDOWN_RULE_SET,
                 player_pool=mock_dk_pool,
                 optimizer_settings=OptimizerSettings(showdown_teams=('X',
                                                                      'Y'), ),
                 verbose=True)

    ntools.assert_not_equal(roster, None)
    ntools.assert_equal(roster.projected(), 421)
Example #16
0
def test_no_mutate_side_Effect():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=fd_nfl_salary_file,
        game=rules.FAN_DUEL,
    )
    run(rule_set=rules.FD_NFL_RULE_SET,
        player_pool=players,
        optimizer_settings=OptimizerSettings(no_offense_against_defense=True),
        constraints=LineupConstraints(locked=['Tom Brady']),
        verbose=True)
    brady = next((p for p in players if p.name == 'Tom Brady'))
    ntools.assert_equal(brady.lock, False)
Example #17
0
def test_csgo_mock():
    mock_dk_pool = _build_mock_player_pool()

    roster = run(
        # CSGO limits three per team
        rule_set=rules.DK_CSGO_SHOWDOWN,
        player_pool=mock_dk_pool,
        optimizer_settings=OptimizerSettings(showdown_teams=('X', 'Y'), ),
        verbose=True)

    ntools.assert_not_equal(roster, None)
    players = roster.players
    ntools.assert_equal(len([x for x in players if x.team == 'Y']), 3)
Example #18
0
def test_nfl_showdown_ban_general():
    mock_dk_pool = _build_mock_player_pool()

    roster = run(rule_set=rules.DK_NFL_SHOWDOWN_RULE_SET,
                 player_pool=mock_dk_pool,
                 optimizer_settings=OptimizerSettings(
                     showdown_teams=('X', 'Y'),
                     no_defense_against_captain=True,
                 ),
                 constraints=LineupConstraints(banned=['A1'], ),
                 verbose=True)
    ntools.assert_not_equal(roster, None)
    ntools.assert_equal(roster.projected(), 334.0)
    ntools.assert_true('A1' not in [x.name for x in roster.players])
Example #19
0
def test_multi_roster_nba():
    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
    )
    second_roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        optimizer_settings=OptimizerSettings(existing_rosters=[roster], ),
    )

    ntools.assert_not_equal(roster, None)
    ntools.assert_not_equal(second_roster, None)
    ntools.assert_false(roster.exact_equal(second_roster))
Example #20
0
def test_nfl_showdown_no_def_against_capt():
    mock_dk_pool = _build_mock_player_pool()

    roster = run(rule_set=rules.DK_NFL_SHOWDOWN_RULE_SET,
                 player_pool=mock_dk_pool,
                 optimizer_settings=OptimizerSettings(
                     showdown_teams=('X', 'Y'),
                     no_defense_against_captain=True,
                 ),
                 verbose=True)

    ntools.assert_not_equal(roster, None)
    ntools.assert_equal(roster.projected(), 408.0)
    for p in roster.players:
        ntools.assert_not_equal(p.name, 'A112')
Example #21
0
def test_nfl_showdown_lock_captain():
    mock_dk_pool = _build_mock_player_pool()

    roster = run(rule_set=rules.DK_NFL_SHOWDOWN_RULE_SET,
                 player_pool=mock_dk_pool,
                 optimizer_settings=OptimizerSettings(
                     showdown_teams=('X', 'Y'),
                     no_defense_against_captain=True,
                 ),
                 constraints=LineupConstraints(position_locked=['A2 CPT X'], ),
                 verbose=True)
    ntools.assert_not_equal(roster, None)
    ntools.assert_equal(roster.projected(), 370.5)
    cpt = [x for x in roster.players if x.pos == 'CPT'][0]
    ntools.assert_equal('A2', cpt.name)
Example #22
0
def test_nfl_showdown_ban_specific():
    mock_dk_pool = _build_mock_player_pool()

    roster = run(rule_set=rules.DK_NFL_SHOWDOWN_RULE_SET,
                 player_pool=mock_dk_pool,
                 optimizer_settings=OptimizerSettings(
                     showdown_teams=('X', 'Y'),
                     no_defense_against_captain=True,
                 ),
                 constraints=LineupConstraints(position_banned=['A1 CPT X'], ),
                 verbose=True)
    ntools.assert_not_equal(roster, None)
    ntools.assert_equal(roster.projected(), 386.0)
    flex = [x for x in roster.players if x.pos == 'FLEX' and x.name == 'A1'][0]
    ntools.assert_equal('A1', flex.name)
Example #23
0
def test_stack():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 optimizer_settings=OptimizerSettings(
                     stack_team='NE',
                     stack_count=5,
                 ))
    ne_players_count = len(
        [p for p in roster.sorted_players() if p.team == 'NE'])
    ntools.assert_equals(5, ne_players_count)
def test_if_one_then_one():
    mock_nba_pool = construct_pool()
    # Base case
    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        verbose=True,
    )
    names = {p.name for p in roster.players}
    ntools.assert_equal(True, 'A1' in names and 'A4' not in names)
    settings = OptimizerSettings(custom_rules=[
        # Always play A1 with A9 and A4
        CustomRule(group_a=lambda p: p.name == 'A1',
                   group_b=lambda p: p.name == 'A4',
                   comparison=lambda s_sum, a, b: s_sum(a) == s_sum(b))
    ])
    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        verbose=True,
        optimizer_settings=settings,
    )
    names = {p.name for p in roster.players}

    # Without this rule, A1 and A4 are not in the same lineup.
    ntools.assert_equal(True, 'A1' in names and 'A4' in names)

    # Confirm now that the rule prevents one without the other
    mock_nba_pool = construct_pool()
    for p in mock_nba_pool:
        if p.name == 'A1':
            # A1 normally would always be in the lineup
            # due to highest projection among PGs
            p.proj = 502
        if p.name == 'A4':
            # A4 projection is so negative it should
            # never be in any lineup
            p.proj = -1_000_000

    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        verbose=True,
        optimizer_settings=settings,
    )
    names = {p.name for p in roster.players}
    ntools.assert_equal(True, 'A1' not in names and 'A4' not in names)
Example #25
0
def test_multi_roster_nfl():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 verbose=True)
    second_roster = run(rule_set=rules.DK_NFL_RULE_SET,
                        player_pool=players,
                        optimizer_settings=OptimizerSettings(
                            existing_rosters=[roster], ),
                        verbose=True)

    ntools.assert_not_equal(roster, None)
    ntools.assert_not_equal(second_roster, None)
    ntools.assert_false(roster.exact_equal(second_roster))
def test_team_rules():
    mock_nba_pool = construct_pool()

    # If two PGs on one team, play the C from same team
    settings = OptimizerSettings(custom_rules=[
        CustomRule(
            group_a=lambda p: p.pos == 'C' and p.team == 'SomeTeam',
            group_b=lambda p: p.pos == 'PG' and p.team == 'SomeTeam',
        )
    ])
    roster = run(
        rule_set=rules.DK_NBA_RULE_SET,
        player_pool=mock_nba_pool,
        verbose=True,
        optimizer_settings=settings,
    )
    names = {p.name for p in roster.players}
    ntools.assert_equal(True, 'A100' in names and 'A101' in names
                        and 'A10' in names)
Example #27
0
def test_te_combo():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 optimizer_settings=OptimizerSettings(
                     force_combo=True,
                     combo_allow_te=True,
                 ))
    qb = roster.sorted_players()[0]
    ntools.assert_equal(qb.pos, 'QB')
    team_count = len([
        x for x in roster.sorted_players()
        if x.team == qb.team and x.pos == 'TE'
    ])
    ntools.assert_equals(team_count, 1)
Example #28
0
    def __init__(
        self,
        players,
        rule_set,
        settings,
    ):
        settings = settings or OptimizerSettings()
        self.solver = pywraplp.Solver(
            'FD',
            pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING
        )
        self.players = players
        self.enumerated_players = list(enumerate(players))
        self.existing_rosters = settings.existing_rosters or []
        self.salary_min = rule_set.salary_min
        self.salary_max = rule_set.salary_max
        self.roster_size = rule_set.roster_size
        self.position_limits = rule_set.position_limits
        self.offensive_positions = rule_set.offensive_positions
        self.defensive_positions = rule_set.defensive_positions
        self.general_position_limits = rule_set.general_position_limits
        self.settings = settings

        self.player_to_idx_map = {}
        self.variables = []
        for idx, player in self.enumerated_players:
            if player.lock and not player.multi_position:
                self.variables.append(
                    self.solver.IntVar(
                        1, 1, player.solver_id
                    )
                )
            else:
                self.variables.append(
                    self.solver.IntVar(0, 1, player.solver_id)
                )

            self.player_to_idx_map[player.solver_id] = idx

        self.objective = self.solver.Objective()
        self.objective.SetMaximization()
Example #29
0
def test_impossible_constraints():
    players = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        projection_file_location=projection_file,
        game=rules.DRAFT_KINGS,
    )
    roster = run(rule_set=rules.DK_NFL_RULE_SET,
                 player_pool=players,
                 optimizer_settings=OptimizerSettings(
                     stacks=[Stack(team='NE', count=100)],
                     no_offense_against_defense=True),
                 constraints=LineupConstraints(
                     banned=['Sammy Watkins', 'Kellen Davis'],
                     locked=['Spencer Ware'],
                     groups=[[('Philip Rivers', 'Sam Bradford', 'Andrew Luck'),
                              2],
                             [('Saints', 'Alshon Jeffery', 'Lamar Miller'),
                              (1, 3)]]),
                 verbose=True)

    ntools.assert_equal(roster, None)
Example #30
0
def test_triple_stack():
    player_pool = salary_download.generate_players_from_csvs(
        salary_file_location=salary_file,
        game=rules.DRAFT_KINGS,
        ruleset=rules.DK_NHL_RULE_SET,
    )
    roster = run(rule_set=rules.DK_NHL_RULE_SET,
                 player_pool=player_pool,
                 verbose=True,
                 optimizer_settings=OptimizerSettings(stacks=[
                     Stack(team='TOR', count=3),
                     Stack(team='COL', count=3),
                     Stack(team='VAN', count=2),
                 ]))
    players = roster.sorted_players()

    phi_players = [x for x in players if x.team == 'TOR']
    fla_players = [x for x in players if x.team == 'COL']
    nsh_players = [x for x in players if x.team == 'VAN']
    ntools.assert_equal(len(phi_players), 3)
    ntools.assert_equal(len(fla_players), 3)
    ntools.assert_equal(len(nsh_players), 2)