forked from paris-saclay-cds/ramp-board
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtasks.py
330 lines (257 loc) · 9.36 KB
/
tasks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
from __future__ import print_function, unicode_literals
import logging
import os
import sys
from invoke import task
logger = logging.getLogger('databoard')
@task
def sign_up_team(c, event, team):
from databoard.db_tools import sign_up_team, get_submissions
sign_up_team(event_name=event, team_name=team)
if os.environ.get('DATABOARD_STAGE') not in ['TEST', 'TESTING']:
submissions = get_submissions(
event_name=event, team_name=team, submission_name="starting_kit")
c.run('sudo chown -R www-data:www-data %s' % submissions[0].path)
@task
def approve_user(c, user):
from databoard.db_tools import approve_user
approve_user(user_name=user)
@task
def serve(c, port=None):
from databoard import app
if port is None:
port = app.config.get('RAMP_SERVER_PORT')
server_port = int(port)
app.run(
debug=False,
port=server_port,
use_reloader=False,
host='0.0.0.0',
processes=1000,
threaded=False)
@task
def profile(c, port=None, profiling_file='profiler.log'):
from werkzeug.contrib.profiler import ProfilerMiddleware
from werkzeug.contrib.profiler import MergeStream
from databoard import app
app.config['PROFILE'] = True
with open(profiling_file, 'w') as f:
stream = MergeStream(sys.stdout, f)
app.wsgi_app = ProfilerMiddleware(
app.wsgi_app, stream=stream, restrictions=[30])
if port is None:
port = app.config.get('RAMP_SERVER_PORT')
server_port = int(port)
app.run(
debug=True,
port=server_port,
use_reloader=False,
host='0.0.0.0',
processes=1000)
@task
def add_problem(c, name, force=False):
"""Add new problem.
If force=True, deletes problem (with all events) if exists.
"""
from databoard.db_tools import add_problem
add_problem(name, force)
@task
def add_event(c, problem_name, event_name, event_title, is_public=True,
force=False):
"""Add new event.
If force=True, deletes event (with all submissions) if exists.
"""
from sqlalchemy.exc import IntegrityError
from databoard.db_tools import add_event
try:
add_event(problem_name, event_name, event_title, is_public, force)
except IntegrityError:
logger.info(
'Attempting to delete event, use "force=True" '
'if you know what you are doing')
@task
def make_event_admin(c, event, user):
from databoard.db_tools import make_event_admin
make_event_admin(event_name=event, admin_name=user)
@task
def train_test(c, event, team=None, submission=None, state=None, force=False,
is_save_y_pred=False, is_parallelize=True):
from databoard.db_tools import (train_test_submissions,
get_submissions,
get_submissions_of_state)
from databoard.config import sandbox_d_name
if state is not None:
submissions = get_submissions_of_state(state)
else:
submissions = get_submissions(
event_name=event, team_name=team, submission_name=submission)
submissions = [
sub
for sub in submissions
if sub.name != sandbox_d_name
]
train_test_submissions(
submissions, force_retrain_test=force, is_parallelize=is_parallelize)
compute_contributivity(c, event, is_save_y_pred=is_save_y_pred)
@task
def score_submission(c, event, team, submission, is_save_y_pred=False):
from databoard.db_tools import score_submission, get_submissions
submissions = get_submissions(
event_name=event, team_name=team, submission_name=submission)
score_submission(submissions[0])
compute_contributivity(c, event, is_save_y_pred=is_save_y_pred)
@task
def set_n_submissions(c, event=None):
from databoard.db_tools import set_n_submissions
set_n_submissions(event)
@task
def compute_contributivity(c, event, is_save_y_pred=False):
from databoard.db_tools import compute_contributivity
from databoard.db_tools import compute_historical_contributivity
from databoard.db_tools import set_n_submissions
compute_contributivity(event, is_save_y_pred=is_save_y_pred)
compute_historical_contributivity(event)
set_n_submissions(event)
@task
def delete_submission(c, event, team, submission):
from databoard.db_tools import delete_submission
delete_submission(event_name=event, team_name=team,
submission_name=submission)
@task
def create_user(c, name, password, lastname, firstname, email,
access_level='user', hidden_notes=''):
from databoard.db_tools import create_user
user = create_user(
name, password, lastname, firstname,
email, access_level, hidden_notes)
return user
@task
def generate_single_password(c):
from databoard.utils import generate_single_password
print(generate_single_password())
@task
def generate_passwords(c, filename, password_filename):
from databoard.utils import generate_passwords
print(generate_passwords(filename, password_filename))
@task
def add_users_from_file(c, filename, password_filename):
"""Add users.
Users whould be the same in the same order in the two files.
"""
import pandas as pd
from termcolor import colored
from rampdb.model import NameClashError
from databoard.utils import remove_non_ascii
from databoard.db_tools import create_user
users_to_add = pd.read_csv(filename)
passwords = pd.read_csv(password_filename)
users_to_add['password'] = passwords['password']
ids = []
for _, user in users_to_add.iterrows():
print(user)
try:
acces_level = user.access_level
except AttributeError:
acces_level = 'user'
try:
entry = create_user(
remove_non_ascii(user.name),
user.password,
user.lastname,
user.firstname,
user.email,
acces_level,
user.hidden_notes
)
ids.append(entry.id)
except NameClashError:
print(colored(
'user {}:{} already in database'.format(user.name, user.email),
'red'))
for id_ in ids:
print(id_)
@task
def send_password_mail(c, user_name, password):
"""Update <user_name>'s password to <password> and mail it to him/her.
Parameters
----------
user_name : user name
password : new password
"""
from databoard.db_tools import send_password_mail
send_password_mail(user_name, password)
@task
def send_password_mails(c, password_filename):
"""Update <name>'s password to <password>, read from <password_f_name>.
Can be generated by `generate_passwords <generate_passwords>`.
Parameters
----------
password_f_name : a csv file with columns `name` and `password`
"""
from databoard.db_tools import send_password_mails
send_password_mails(password_filename)
@task
def sign_up_event_users_from_file(c, filename, event):
import pandas as pd
from termcolor import colored
from rampdb.model import DuplicateSubmissionError
from databoard.utils import remove_non_ascii
users_to_sign_up = pd.read_csv(filename)
for _, user in users_to_sign_up.iterrows():
username = remove_non_ascii(user.name)
print('signing up {} to {}'.format(username, event))
try:
sign_up_team(c, event, username)
except DuplicateSubmissionError:
print(colored(
'user {}:{} already signed up'.format(username, user.email),
'red'))
@task
def update_leaderboards(c, event=None):
from rampdb.model import Event
from databoard.db_tools import update_leaderboards
if event is None:
events = Event.query.all()
for event in events:
update_leaderboards(event.name)
else:
update_leaderboards(event)
@task
def update_user_leaderboards(c, event, user):
from databoard.db_tools import update_user_leaderboards
update_user_leaderboards(event, user)
@task
def update_all_user_leaderboards(c, event=None):
from rampdb.model import Event
from databoard.db_tools import update_all_user_leaderboards
if event is None:
events = Event.query.all()
for event in events:
update_all_user_leaderboards(event.name)
else:
update_all_user_leaderboards(event)
@task
def backend_train_test_loop(c, event=None, timeout=30,
is_compute_contributivity=True,
is_parallelize=True):
"""Automated training loop.
Picks up the earliest new submission and trains it, in an infinite
loop.
Parameters
----------
e : string
Event name. If set, only train submissions from that event.
If event name is prefixed by not, it excludes that event.
"""
from databoard.db_tools import backend_train_test_loop
backend_train_test_loop(
event, timeout, is_compute_contributivity, is_parallelize)
@task
def set_state(c, event, team, submission, state):
"Set submission state"
from databoard.db_tools import set_state
set_state(event, team, submission, state)
@task
def exclude_from_ensemble(c, event, team, submission):
from databoard.db_tools import exclude_from_ensemble
exclude_from_ensemble(event, team, submission)