Skip to content

Commit

Permalink
Merge branch 'release-2.6.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
DimaKudosh committed Sep 2, 2019
2 parents b710b7e + 35b981b commit 6ad7242
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 3 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,11 @@

All notable changes to this project will be documented in this file.

## [v2.6.1]
- Added soccer for DK Captain Mode
- Added Fanduel minimum teams restriction
- Fixed export for DK

## [v2.6.0]
- Added ability to specify multiple positions stacks in positions for same team rule
- Added teams exposure rule
Expand Down
10 changes: 10 additions & 0 deletions pydfs_lineup_optimizer/rules.py
Expand Up @@ -465,3 +465,13 @@ def apply(self, solver, players_dict):
for team in self.optimizer.available_teams:
players_from_team = [variable for player, variable in players_dict.items() if player.team == team]
solver.add_constraint(players_from_team, None, SolverSign.LTE, self.MAXIMUM_HITTERS_FROM_ONE_TEAM)


class FanduelMinimumTeamsRule(OptimizerRule):
MINIMUM_TEAMS = 3

def apply(self, solver, players_dict):
for teams in combinations(self.optimizer.available_teams, self.MINIMUM_TEAMS - 1):
players_from_teams = [variable for player, variable in players_dict.items() if player.team in teams]
solver.add_constraint(players_from_teams, None, SolverSign.LTE,
self.optimizer.settings.get_total_players() - 1)
6 changes: 4 additions & 2 deletions pydfs_lineup_optimizer/sites/fanduel/settings.py
Expand Up @@ -2,13 +2,14 @@
from pydfs_lineup_optimizer.constants import Sport, Site
from pydfs_lineup_optimizer.sites.sites_registry import SitesRegistry
from pydfs_lineup_optimizer.lineup_printer import DropLowestLineupPrinter
from pydfs_lineup_optimizer.rules import FanduelBaseballRosterRule
from pydfs_lineup_optimizer.rules import FanduelBaseballRosterRule, FanduelMinimumTeamsRule


class FanDuelSettings(BaseSettings):
site = Site.FANDUEL
budget = 60000
max_from_one_team = 4
extra_rules = [FanduelMinimumTeamsRule]


@SitesRegistry.register_settings
Expand Down Expand Up @@ -66,7 +67,7 @@ class FanDuelBaseballSettings(FanDuelSettings):
max_from_one_team = 5
sport = Sport.BASEBALL
budget = 35000
extra_rules = [FanduelBaseballRosterRule]
extra_rules = [FanduelBaseballRosterRule, FanduelMinimumTeamsRule]
positions = [
LineupPosition('P', ('P',)),
LineupPosition('C/1B', ('C', '1B')),
Expand All @@ -84,6 +85,7 @@ class FanDuelBaseballSettings(FanDuelSettings):
class FanDuelWnbaSettings(FanDuelSettings):
sport = Sport.WNBA
budget = 40000
extra_rules = []
positions = [
LineupPosition('G', ('G', )),
LineupPosition('G', ('G', )),
Expand Down
2 changes: 1 addition & 1 deletion pydfs_lineup_optimizer/version.py
@@ -1 +1 @@
__version__ = '2.6.0'
__version__ = '2.6.1'
28 changes: 28 additions & 0 deletions tests/test_rules.py
Expand Up @@ -503,3 +503,31 @@ def test_teams_exposure_correctness_with_positions_for_same_team(self):
def test_incorrect_team_name(self):
with self.assertRaises(LineupOptimizerException):
self.optimizer.set_teams_max_exposure({'WRONG TEAM': 0.5})


class TestFanduelMinimumTeamsTestCase(unittest.TestCase):
def setUp(self):
self.players = [
Player('1', '1', '1', ['P'], 'HOU', 3000, 10),
Player('2', '2', '2', ['P'], 'BOS', 3000, 20),
Player('3', '3', '3', ['C'], 'BOS', 3000, 30),
Player('4', '4', '4', ['SS'], 'HOU', 3000, 30),
Player('5', '5', '5', ['OF'], 'HOU', 3000, 30),
Player('6', '6', '6', ['OF'], 'HOU', 3000, 30),
Player('7', '7', '7', ['OF'], 'HOU', 3000, 30),
Player('8', '8', '8', ['1B'], 'BOS', 3000, 30),
Player('9', '9', '9', ['2B'], 'BOS', 3000, 5),
Player('10', '10', '10', ['3B'], 'BOS', 3000, 5),
Player('11', '11', '11', ['P'], 'ARI', 3000, 5),
]
self.optimizer = get_optimizer(Site.FANDUEL, Sport.BASEBALL)
self.optimizer.load_players(self.players)

def test_minimum_teams(self):
lineup = next(self.optimizer.optimize(1))
self.assertEqual(len(set(player.team for player in lineup)), 3)

def test_minimum_teams_with_stacking(self):
self.optimizer.set_team_stacking([5, 4])
with self.assertRaises(LineupOptimizerException):
next(self.optimizer.optimize(1))

0 comments on commit 6ad7242

Please sign in to comment.