Source code for challengeutils.evaluation_queue

"""Evaluation Queue helper functions"""
import time

from synapseclient import Synapse


def _convert_date_to_epoch(date_string):
    """Converts local time dates in YEAR-MM-DDTHH:MM:SS format
    (ie. 2020-02-21T23:53:27) to UTC epochtime in milliseconds and
    timestring

    Args:
        date_string: Local time date in YEAR-MM-DDTHH:MM:SS format
                     (ie. 2020-02-21T23:53:27)

    Returns:
        dict: {"time_string": UTC time in YEAR-MM-DDTHH:MM:SS format
               "epochtime_ms": UTC epoch time}

    """
    local_time_struct = time.strptime(date_string, "%Y-%m-%dT%H:%M:%S")
    epochtime = time.mktime(local_time_struct)
    utc_time_struct = time.gmtime(epochtime)
    return {
        "time_string": time.strftime("%Y-%m-%dT%H:%M:%S.000Z", utc_time_struct),
        "epochtime_ms": int(epochtime * 1000),
    }


[docs]class SubmissionQuota: """A SubmissionQuota object https://rest-docs.synapse.org/rest/org/sagebionetworks/evaluation/model/SubmissionQuota.html """ def __init__( self, firstRoundStart: str = None, roundDurationMillis: int = None, numberOfRounds: int = None, submissionLimit: int = None, ): self.firstRoundStart = firstRoundStart self.roundDurationMillis = roundDurationMillis self.numberOfRounds = numberOfRounds self.submissionLimit = submissionLimit
def _create_quota( round_start: str = None, round_end: str = None, number_of_rounds: int = None, round_duration: int = None, submission_limit: int = None, ) -> SubmissionQuota: """Creates the SubmissionQuota object Args: round_start: Start of round (local time) in YEAR-MM-DDTHH:MM:SS format (ie. 2020-02-21T17:00:00) round_end: End of round (local time) in YEAR-MM-DDTHH:MM:SS format (ie. 2020-02-21T19:00:00) number_of_rounds: Number of rounds round_duration: Round duration in milliseconds submission_limit: Number of submissions allowed per team Returns: SubmissionQuota object """ if round_end is not None and round_duration is not None: raise ValueError("Can only specify round_end or round_duration") if round_end is not None and round_start is None: raise ValueError( "If round_end is specified, " "round_start must also be specified" ) if round_start: round_start_info = _convert_date_to_epoch(round_start) round_start_utc = round_start_info["epochtime_ms"] # Must set the time in UTC time, but must pass in local time # into function round_start = round_start_info["time_string"] if round_end: round_end_info = _convert_date_to_epoch(round_end) round_duration = round_end_info["epochtime_ms"] - round_start_utc if round_duration is not None and round_duration < 0: raise ValueError( "Specified round_duration must be >= 0, or " "round_end must be > round_start" ) quota = SubmissionQuota( firstRoundStart=round_start, numberOfRounds=number_of_rounds, roundDurationMillis=round_duration, submissionLimit=submission_limit, ) return quota
[docs]def set_evaluation_quota(syn: Synapse, evalid: int, **kwargs): """Sets evaluation submission limit quota. This WILL erase any old quota you had previously set. Note - round_start must be specified with either round_end or round_duration and number_of_rounds must be defined for the time limits to work. submission_limit will work without number_of_rounds. Args: syn: Synapse object evalid: Evaluation id **kwargs: round_start: Start of round (local time) in YEAR-MM-DDTHH:MM:SS format (ie. 2020-02-21T17:00:00) round_end: End of round (local time) in YEAR-MM-DDTHH:MM:SS format (ie. 2020-02-21T19:00:00) number_of_rounds: Number of rounds round_duration: Round duration in milliseconds submission_limit: Number of submissions allowed per team Returns: A synapseclient.Evaluation Examples: >>> set_evaluation_quota(syn, 12345, round_start="2020-02-21T17:00:00", round_end="2020-02-23T17:00:00", number_of_rounds=1, submission_limit=3) """ quota = _create_quota(**kwargs) evaluation = syn.getEvaluation(evalid) evaluation.quota = vars(quota) evaluation = syn.store(evaluation) return evaluation