sports-manager 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -0
- data/lib/sports_manager/constraints/all_different_constraint.rb +3 -1
- data/lib/sports_manager/constraints/match_constraint.rb +5 -3
- data/lib/sports_manager/constraints/multi_category_constraint.rb +10 -7
- data/lib/sports_manager/constraints/next_round_constraint.rb +8 -6
- data/lib/sports_manager/constraints/no_overlapping_constraint.rb +9 -5
- data/lib/sports_manager/tournament_generator.rb +8 -3
- data/lib/sports_manager/tournament_problem_builder.rb +24 -3
- data/lib/sports_manager/version.rb +1 -1
- data/sports-manager.gemspec +1 -1
- metadata +7 -8
- data/.rspec +0 -1
- data/.rubocop.yml +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 896fa713f3fa999a6d852b8987a626998201f976a48c382297944bd0068488e9
|
4
|
+
data.tar.gz: e3f14be9cd4eaa4edf88a084ae4d041afd70800c536177fed88f20e5bb8be02c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '099e7f7e9049254d6ee2b68a34acb263308235f0d67e829fbaaff182b3cb59fbbbb75ab52471fd620af2c31551630008fc0613719ef2d4f802e4a19f9e57807e'
|
7
|
+
data.tar.gz: e2e7c3057107fd7ae76f1dcb364246003cf8ff889fc1a9ad4f8a5aee42cbfaa580c944d33455eef1cb0dc72a37ead9b087c25799adee3e2e465f9c789bc2c0ed
|
data/README.md
CHANGED
@@ -8,7 +8,9 @@ module SportsManager
|
|
8
8
|
attr_reader :matches
|
9
9
|
|
10
10
|
def self.for_tournament(tournament:, csp:)
|
11
|
-
|
11
|
+
matches = tournament.matches.values.flatten
|
12
|
+
|
13
|
+
csp.add_constraint(new(matches))
|
12
14
|
end
|
13
15
|
|
14
16
|
def initialize(matches)
|
@@ -10,9 +10,11 @@ module SportsManager
|
|
10
10
|
def self.for_tournament(tournament:, csp:)
|
11
11
|
tournament.matches.each do |(_category, matches)|
|
12
12
|
matches.select(&:previous_matches?).each do |match|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
match.previous_matches.each do |previous_match|
|
14
|
+
csp.add_constraint(
|
15
|
+
new(target_match: match, matches: [previous_match])
|
16
|
+
)
|
17
|
+
end
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
@@ -7,19 +7,22 @@ module SportsManager
|
|
7
7
|
:match_time, :break_time, :minimum_match_gap
|
8
8
|
|
9
9
|
MINUTE = 60
|
10
|
+
IN_PAIRS = 2
|
10
11
|
|
11
12
|
def self.for_tournament(tournament:, csp:)
|
12
13
|
tournament.multi_tournament_participants.each do |participant|
|
13
14
|
matches = tournament.find_participant_matches(participant)
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
matches.combination(IN_PAIRS) do |match1, match2|
|
17
|
+
constraint = new(
|
18
|
+
target_participant: participant,
|
19
|
+
matches: [match1, match2],
|
20
|
+
match_time: tournament.match_time,
|
21
|
+
break_time: tournament.break_time
|
22
|
+
)
|
21
23
|
|
22
|
-
|
24
|
+
csp.add_constraint(constraint)
|
25
|
+
end
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
@@ -13,12 +13,14 @@ module SportsManager
|
|
13
13
|
.matches.values.flatten
|
14
14
|
.select(&:previous_matches?)
|
15
15
|
.each do |match|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
match.previous_matches.each do |previous_match|
|
17
|
+
csp.add_constraint new(
|
18
|
+
target_match: match,
|
19
|
+
matches: [previous_match],
|
20
|
+
match_time: tournament.match_time,
|
21
|
+
break_time: tournament.break_time
|
22
|
+
)
|
23
|
+
end
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
@@ -5,13 +5,17 @@ module SportsManager
|
|
5
5
|
class NoOverlappingConstraint < ::CSP::Constraint
|
6
6
|
attr_reader :matches, :match_time
|
7
7
|
|
8
|
+
IN_PAIRS = 2
|
9
|
+
|
8
10
|
def self.for_tournament(tournament:, csp:)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
matches = tournament.matches.values.flatten
|
12
|
+
match_time = tournament.match_time
|
13
|
+
|
14
|
+
matches.combination(IN_PAIRS) do |match1, match2|
|
15
|
+
csp.add_constraint(
|
16
|
+
new(matches: [match1, match2], match_time: match_time)
|
13
17
|
)
|
14
|
-
|
18
|
+
end
|
15
19
|
end
|
16
20
|
|
17
21
|
def initialize(matches:, match_time:)
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'timeout'
|
4
|
+
|
3
5
|
# rubocop:disable Metrics/AbcSize
|
4
6
|
module SportsManager
|
5
7
|
# Public:Tournament Solver
|
@@ -22,7 +24,7 @@ module SportsManager
|
|
22
24
|
extend Forwardable
|
23
25
|
|
24
26
|
attr_reader :format, :tournament, :variables, :domains,
|
25
|
-
:ordering, :filtering, :csp
|
27
|
+
:ordering, :filtering, :lookahead, :csp, :timeout
|
26
28
|
|
27
29
|
attr_accessor :days, :subscriptions, :matches, :courts, :game_length, :rest_break, :single_day_matches,
|
28
30
|
:tournament_type
|
@@ -43,13 +45,15 @@ module SportsManager
|
|
43
45
|
.call
|
44
46
|
end
|
45
47
|
|
46
|
-
def initialize(format: :cli)
|
48
|
+
def initialize(format: :cli, timeout: nil)
|
47
49
|
@format = format
|
50
|
+
@timeout = timeout
|
48
51
|
@days = {}
|
49
52
|
@subscriptions = {}
|
50
53
|
@matches = {}
|
51
54
|
@ordering = Algorithms::Ordering::MultipleMatchesParticipant
|
52
55
|
@filtering = Algorithms::Filtering::NoOverlap
|
56
|
+
@lookahead = CSP::Algorithms::Lookahead::Ac3
|
53
57
|
end
|
54
58
|
|
55
59
|
def add_day(day, start, finish)
|
@@ -128,7 +132,7 @@ module SportsManager
|
|
128
132
|
def call
|
129
133
|
setup
|
130
134
|
|
131
|
-
solutions = csp.solve
|
135
|
+
solutions = Timeout.timeout(timeout) { csp.solve }
|
132
136
|
|
133
137
|
TournamentSolution
|
134
138
|
.new(tournament: tournament, solutions: solutions)
|
@@ -153,6 +157,7 @@ module SportsManager
|
|
153
157
|
.add_domains(domains)
|
154
158
|
.add_ordering(ordering)
|
155
159
|
.add_filtering(filtering)
|
160
|
+
.add_lookahead(lookahead)
|
156
161
|
.add_constraint(Constraints::AllDifferentConstraint)
|
157
162
|
.add_constraint(Constraints::NoOverlappingConstraint)
|
158
163
|
.add_constraint(Constraints::MatchConstraint)
|
@@ -20,7 +20,8 @@ module SportsManager
|
|
20
20
|
# csp = builder.build
|
21
21
|
class TournamentProblemBuilder
|
22
22
|
attr_reader :variables, :domains, :constraints, :max_solutions,
|
23
|
-
:filtering_algorithm, :ordering_algorithm, :
|
23
|
+
:filtering_algorithm, :ordering_algorithm, :lookahead_algorithm,
|
24
|
+
:tournament
|
24
25
|
|
25
26
|
MINIMUM_SOLUTIONS = 1
|
26
27
|
|
@@ -31,6 +32,7 @@ module SportsManager
|
|
31
32
|
|
32
33
|
@filtering_algorithm = nil
|
33
34
|
@ordering_algorithm = nil
|
35
|
+
@lookahead_algorithm = nil
|
34
36
|
|
35
37
|
@max_solutions = MINIMUM_SOLUTIONS
|
36
38
|
|
@@ -61,6 +63,12 @@ module SportsManager
|
|
61
63
|
self
|
62
64
|
end
|
63
65
|
|
66
|
+
def add_lookahead(lookahead_algorithm_class)
|
67
|
+
@lookahead_algorithm = lookahead_algorithm_class
|
68
|
+
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
64
72
|
# TODO: change to pass symbol instead of class?
|
65
73
|
def add_constraint(constraint_class)
|
66
74
|
@constraints |= Utils::Array.wrap(constraint_class)
|
@@ -79,8 +87,11 @@ module SportsManager
|
|
79
87
|
variables.each do |variable|
|
80
88
|
problem.add_variable(variable, domains: domains[variable])
|
81
89
|
end
|
82
|
-
|
83
|
-
problem.
|
90
|
+
|
91
|
+
problem.add_ordering(ordering(problem))
|
92
|
+
problem.add_filtering(filtering(problem))
|
93
|
+
problem.add_lookahead(lookahead(problem))
|
94
|
+
|
84
95
|
build_constraint(problem)
|
85
96
|
end
|
86
97
|
end
|
@@ -92,13 +103,23 @@ module SportsManager
|
|
92
103
|
end
|
93
104
|
|
94
105
|
def ordering(problem)
|
106
|
+
return if ordering_algorithm.nil?
|
107
|
+
|
95
108
|
ordering_algorithm.for(problem: problem, dependency: tournament)
|
96
109
|
end
|
97
110
|
|
98
111
|
def filtering(problem)
|
112
|
+
return if filtering_algorithm.nil?
|
113
|
+
|
99
114
|
filtering_algorithm.for(problem: problem, dependency: tournament)
|
100
115
|
end
|
101
116
|
|
117
|
+
def lookahead(problem)
|
118
|
+
return if lookahead_algorithm.nil?
|
119
|
+
|
120
|
+
lookahead_algorithm.new(problem)
|
121
|
+
end
|
122
|
+
|
102
123
|
def build_constraint(csp)
|
103
124
|
ConstraintBuilder.build(tournament: tournament, csp: csp, constraints: constraints)
|
104
125
|
end
|
data/sports-manager.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.files = Dir.chdir(__dir__) do
|
22
22
|
`git ls-files -z`.split("\x0").reject do |f|
|
23
23
|
(File.expand_path(f) == __FILE__) ||
|
24
|
-
f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile])
|
24
|
+
f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile .rspec .rubocop])
|
25
25
|
end
|
26
26
|
end
|
27
27
|
spec.bindir = 'exe'
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sports-manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- André Benjamim
|
8
8
|
- Gustavo Alberto
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-
|
12
|
+
date: 2024-08-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: csp-resolver
|
@@ -33,8 +33,6 @@ executables: []
|
|
33
33
|
extensions: []
|
34
34
|
extra_rdoc_files: []
|
35
35
|
files:
|
36
|
-
- ".rspec"
|
37
|
-
- ".rubocop.yml"
|
38
36
|
- CODE_OF_CONDUCT.md
|
39
37
|
- CONTRIBUTING.md
|
40
38
|
- MIT-LICENSE
|
@@ -98,7 +96,7 @@ licenses: []
|
|
98
96
|
metadata:
|
99
97
|
homepage_uri: https://github.com/Rebase-BR/sports-manager
|
100
98
|
source_code_uri: https://github.com/Rebase-BR/sports-manager
|
101
|
-
post_install_message:
|
99
|
+
post_install_message:
|
102
100
|
rdoc_options: []
|
103
101
|
require_paths:
|
104
102
|
- lib
|
@@ -113,8 +111,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
111
|
- !ruby/object:Gem::Version
|
114
112
|
version: '0'
|
115
113
|
requirements: []
|
116
|
-
|
117
|
-
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 2.7.6.2
|
116
|
+
signing_key:
|
118
117
|
specification_version: 4
|
119
118
|
summary: A Ruby tournament schedule generator tool.
|
120
119
|
test_files: []
|
data/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--require spec_helper
|
data/.rubocop.yml
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
AllCops:
|
2
|
-
TargetRubyVersion: 2.5
|
3
|
-
NewCops: enable
|
4
|
-
SuggestExtensions: false
|
5
|
-
Metrics/BlockLength:
|
6
|
-
Exclude:
|
7
|
-
- spec/**/*.rb
|
8
|
-
Metrics/ClassLength:
|
9
|
-
Max: 200
|
10
|
-
Metrics/MethodLength:
|
11
|
-
Max: 20
|
12
|
-
Layout/FirstArrayElementIndentation:
|
13
|
-
EnforcedStyle: consistent
|
14
|
-
Layout/FirstHashElementIndentation:
|
15
|
-
EnforcedStyle: consistent
|
16
|
-
Layout/HashAlignment:
|
17
|
-
EnforcedLastArgumentHashStyle: always_inspect
|
18
|
-
Layout/MultilineMethodCallIndentation:
|
19
|
-
EnforcedStyle: indented
|
20
|
-
Style/Documentation:
|
21
|
-
Enabled: false
|
22
|
-
Layout/EndAlignment:
|
23
|
-
EnforcedStyleAlignWith: variable
|
24
|
-
Style/ObjectThen:
|
25
|
-
EnforcedStyle: yield_self
|
26
|
-
Naming/FileName:
|
27
|
-
Exclude:
|
28
|
-
- 'lib/sports-manager.rb'
|
29
|
-
Style/OpenStructUse:
|
30
|
-
Enabled: false
|
31
|
-
Gemspec/RequireMFA:
|
32
|
-
Enabled: false
|