コード例 #1
0
ファイル: ide.py プロジェクト: zhanshihui/OnlineJudge
    def judge(self):
        if not self.test_case:
            raise ValueError("invalid parameter")

        sub_config = list(
            filter(lambda item: self.language == item["name"],
                   SysOptions.languages))[0]

        max_cpu_time = 2000
        max_memory = 1024 * 1024 * 128
        output = True
        data = {
            "language_config": sub_config["config"],
            "src": self.src,
            "max_cpu_time": max_cpu_time,
            "max_memory": max_memory,
            "test_case": self.test_case,
            "output": output
        }
        with ChooseJudgeServer() as server:
            if not server:
                cache.lpush(CacheKey.waiting_queue, json.dumps(data))
                return "JudgeServer ERROR"
            return self._request(urljoin(server.service_url, "/judge"),
                                 data=data)
コード例 #2
0
ファイル: dispatcher.py プロジェクト: custoj/CustOJ-Backend
    def debug(self):
        if not self.test_case:
            return "Null Stdin"
        language = self.language
        sub_config = list(
            filter(lambda item: language == item["name"],
                   SysOptions.languages))[0]
        time_limit = 9000
        if language in ["C", "C++"]:
            time_limit = 3000
        data = {
            "language_config": sub_config["config"],
            "src": self.code,
            "max_cpu_time": time_limit,
            "max_memory": 1024 * 1024 * 512,
            "test_case": self.test_case,
            "output": True
        }

        with ChooseJudgeServer() as server:
            if not server:
                cache.lpush(CacheKey.waiting_queue, json.dumps(data))
                return
            return self._request(urljoin(server.service_url, "/judge"),
                                 data=data)
コード例 #3
0
ファイル: dispatcher.py プロジェクト: joeyac/OnlineJudge
    def judge(self):
        server = self.choose_judge_server()
        if not server:
            data = {"submission_id": self.submission.id, "problem_id": self.problem.id}
            cache.lpush(CacheKey.waiting_queue, json.dumps(data))
            return

        language = self.submission.language
        sub_config = list(filter(lambda item: language == item["name"], languages))[0]
        spj_config = {}
        if self.problem.spj_code:
            for lang in spj_languages:
                if lang["name"] == self.problem.spj_language:
                    spj_config = lang["spj"]
                    break

        if language in self.problem.template:
            template = parse_problem_template(self.problem.template[language])
            code = f"{template['prepend']}\n{self.submission.code}\n{template['append']}"
        else:
            code = self.submission.code

        data = {
            "language_config": sub_config["config"],
            "src": code,
            "max_cpu_time": self.problem.time_limit,
            "max_memory": 1024 * 1024 * self.problem.memory_limit,
            "test_case_id": self.problem.test_case_id,
            "output": False,
            "spj_version": self.problem.spj_version,
            "spj_config": spj_config.get("config"),
            "spj_compile_config": spj_config.get("compile"),
            "spj_src": self.problem.spj_code
        }

        Submission.objects.filter(id=self.submission.id).update(result=JudgeStatus.JUDGING)

        resp = self._request(urljoin(server.service_url, "/judge"), data=data)
        if resp["err"]:
            self.submission.result = JudgeStatus.COMPILE_ERROR
            self.submission.statistic_info["err_info"] = resp["data"]
            self.submission.statistic_info["score"] = 0
        else:
            resp["data"].sort(key=lambda x: int(x["test_case"]))
            self.submission.info = resp
            self._compute_statistic_info(resp["data"])
            error_test_case = list(filter(lambda case: case["result"] != 0, resp["data"]))
            # ACM模式下,多个测试点全部正确则AC,否则取第一个错误的测试点的状态
            # OI模式下, 若多个测试点全部正确则AC, 若全部错误则取第一个错误测试点状态,否则为部分正确
            if not error_test_case:
                self.submission.result = JudgeStatus.ACCEPTED
            elif self.problem.rule_type == ProblemRuleType.ACM or len(error_test_case) == len(resp["data"]):
                self.submission.result = error_test_case[0]["result"]
            else:
                self.submission.result = JudgeStatus.PARTIALLY_ACCEPTED
        self.submission.save()
        self.release_judge_server(server.id)

        if self.contest_id:
            if self.contest.status != ContestStatus.CONTEST_UNDERWAY or \
                    User.objects.get(id=self.submission.user_id).is_contest_admin(self.contest):
                logger.info(
                    "Contest debug mode, id: " + str(self.contest_id) + ", submission id: " + self.submission.id)
                return
            self.update_contest_problem_status()
            self.update_contest_rank()
        else:
            if self.last_result:
                self.update_problem_status_rejudge()
            else:
                self.update_problem_status()

        # 至此判题结束,尝试处理任务队列中剩余的任务
        process_pending_task()
コード例 #4
0
ファイル: dispatcher.py プロジェクト: gbrspace/OnlineJudge-1
    def judge(self):
        server = self.choose_judge_server()
        if not server:
            data = {
                "submission_id": self.submission.id,
                "problem_id": self.problem.id
            }
            cache.lpush(CacheKey.waiting_queue, json.dumps(data))
            return

        language = self.submission.language
        sub_config = list(
            filter(lambda item: language == item["name"], languages))[0]
        spj_config = {}
        if self.problem.spj_code:
            for lang in spj_languages:
                if lang["name"] == self.problem.spj_language:
                    spj_config = lang["spj"]
                    break

        if language in self.problem.template:
            template = parse_problem_template(self.problem.template[language])
            code = f"{template['prepend']}\n{self.submission.code}\n{template['append']}"
        else:
            code = self.submission.code

        data = {
            "language_config": sub_config["config"],
            "src": code,
            "max_cpu_time": self.problem.time_limit,
            "max_memory": 1024 * 1024 * self.problem.memory_limit,
            "test_case_id": self.problem.test_case_id,
            "output": False,
            "spj_version": self.problem.spj_version,
            "spj_config": spj_config.get("config"),
            "spj_compile_config": spj_config.get("compile"),
            "spj_src": self.problem.spj_code
        }

        Submission.objects.filter(id=self.submission.id).update(
            result=JudgeStatus.JUDGING)

        service_url = server.service_url
        # not set service_url, it should be a linked container
        if not service_url:
            service_url = settings.DEFAULT_JUDGE_SERVER_SERVICE_URL
        resp = self._request(urljoin(service_url, "/judge"), data=data)
        if resp["err"]:
            self.submission.result = JudgeStatus.COMPILE_ERROR
            self.submission.statistic_info["err_info"] = resp["data"]
            self.submission.statistic_info["score"] = 0
        else:
            resp["data"].sort(key=lambda x: int(x["test_case"]))
            self.submission.info = resp
            self._compute_statistic_info(resp["data"])
            error_test_case = list(
                filter(lambda case: case["result"] != 0, resp["data"]))
            # ACM模式下,多个测试点全部正确则AC,否则取第一个错误的测试点的状态
            # OI模式下, 若多个测试点全部正确则AC, 若全部错误则取第一个错误测试点状态,否则为部分正确
            if not error_test_case:
                self.submission.result = JudgeStatus.ACCEPTED
            elif self.problem.rule_type == ProblemRuleType.ACM or len(
                    error_test_case) == len(resp["data"]):
                self.submission.result = error_test_case[0]["result"]
            else:
                self.submission.result = JudgeStatus.PARTIALLY_ACCEPTED
        self.submission.save()
        self.release_judge_server(server.id)

        if self.contest_id:
            self.update_contest_problem_status()
            self.update_contest_rank()
        else:
            self.update_problem_status()

        # 至此判题结束,尝试处理任务队列中剩余的任务
        process_pending_task()
コード例 #5
0
    def judge(self):
        language = self.submission.language
        sub_config = list(
            filter(lambda item: language == item["name"],
                   SysOptions.languages))[0]
        spj_config = {}
        if self.problem.spj_code:
            for lang in SysOptions.spj_languages:
                if lang["name"] == self.problem.spj_language:
                    spj_config = lang["spj"]
                    break

        if language in self.problem.template:
            template = parse_problem_template(self.problem.template[language])
            code = f"{template['prepend']}\n{self.submission.code}\n{template['append']}"
        else:
            code = self.submission.code

        data = {
            "language_config": sub_config["config"],
            "src": code,
            "max_cpu_time": self.problem.time_limit,
            "max_memory": 1024 * 1024 * self.problem.memory_limit,
            "test_case_id": self.problem.test_case_id,
            "output": True,
            "spj_version": self.problem.spj_version,
            "spj_config": spj_config.get("config"),
            "spj_compile_config": spj_config.get("compile"),
            "spj_src": self.problem.spj_code,
            "io_mode": self.problem.io_mode,
            "output_description": self.problem.output_description,
            "input_str": self.problem.input_str
        }

        with ChooseJudgeServer() as server:
            if not server:
                data = {
                    "submission_id": self.submission.id,
                    "problem_id": self.problem.id
                }
                cache.lpush(CacheKey.waiting_queue, json.dumps(data))
                return
            Submission.objects.filter(id=self.submission.id).update(
                result=JudgeStatus.JUDGING)
            resp = self._request(urljoin(server.service_url, "/judge"),
                                 data=data)

        if not resp:
            Submission.objects.filter(id=self.submission.id).update(
                result=JudgeStatus.SYSTEM_ERROR)
            return

        if resp["err"]:
            self.submission.result = JudgeStatus.COMPILE_ERROR
            self.submission.statistic_info["err_info"] = resp["data"]
            self.submission.statistic_info["score"] = 0
        else:
            resp["data"].sort(key=lambda x: int(x["test_case"]))
            self.submission.info = resp
            self._compute_statistic_info(resp["data"])
            error_test_case = list(
                filter(lambda case: case["result"] != 0, resp["data"]))
            # ACM模式下,多个测试点全部正确则AC,否则取第一个错误的测试点的状态
            # OI模式下, 若多个测试点全部正确则AC, 若全部错误则取第一个错误测试点状态,否则为部分正确
            if not error_test_case:
                self.submission.result = JudgeStatus.ACCEPTED
            elif self.problem.rule_type == ProblemRuleType.ACM or len(
                    error_test_case) == len(resp["data"]):
                self.submission.result = error_test_case[0]["result"]
            else:
                self.submission.result = JudgeStatus.PARTIALLY_ACCEPTED
        self.submission.save()

        if self.contest_id:
            if self.contest.status != ContestStatus.CONTEST_UNDERWAY or \
                    User.objects.get(id=self.submission.user_id).is_contest_admin(self.contest):
                logger.info("Contest debug mode, id: " + str(self.contest_id) +
                            ", submission id: " + self.submission.id)
                return
            with transaction.atomic():
                self.update_contest_problem_status()
                self.update_contest_rank()
        else:
            if self.last_result:
                self.update_problem_status_rejudge()
            else:
                self.update_problem_status()

        # 至此判题结束,尝试处理任务队列中剩余的任务
        process_pending_task()
コード例 #6
0
    def judge(self):
        language = self.submission.language
        sub_config = list(
            filter(lambda item: language == item["name"],
                   SysOptions.languages))[0]
        spj_config = {}
        if self.problem.spj_code:
            for lang in SysOptions.spj_languages:
                if lang["name"] == self.problem.spj_language:
                    spj_config = lang["spj"]
                    break

        if language in self.problem.template:
            template = parse_problem_template(self.problem.template[language])
            code = f"{template['prepend']}\n{self.submission.code}\n{template['append']}"
        else:
            code = self.submission.code

        data = {
            "language_config": sub_config["config"],
            "src": code,
            "max_cpu_time": self.problem.time_limit,
            "max_memory": 1024 * 1024 * self.problem.memory_limit,
            "test_case_id": self.problem.test_case_id,
            "output": False,
            "spj_version": self.problem.spj_version,
            "spj_config": spj_config.get("config"),
            "spj_compile_config": spj_config.get("compile"),
            "spj_src": self.problem.spj_code,
            "io_mode": self.problem.io_mode
        }

        with ChooseJudgeServer() as server:
            if not server:
                data = {
                    "submission_id": self.submission.id,
                    "problem_id": self.problem.id
                }
                cache.lpush(CacheKey.waiting_queue, json.dumps(data))
                return
            Submission.objects.filter(id=self.submission.id).update(
                result=JudgeStatus.JUDGING)
            resp = self._request(urljoin(server.service_url, "/judge"),
                                 data=data)

        if not resp:
            Submission.objects.filter(id=self.submission.id).update(
                result=JudgeStatus.SYSTEM_ERROR)
            return

        if resp["err"]:
            self.submission.result = JudgeStatus.COMPILE_ERROR
            self.submission.statistic_info["err_info"] = resp["data"]
            self.submission.statistic_info["score"] = 0
        else:
            resp["data"].sort(key=lambda x: int(x["test_case"]))
            self.submission.info = resp
            self._compute_statistic_info(resp["data"])
            error_test_case = list(
                filter(lambda case: case["result"] != 0, resp["data"]))
            # In ACM mode, if multiple test points are all correct, then AC,
            # otherwise, take the status of the first wrong test point
            # In OI mode, if multiple test points are all correct, AC is used,
            # if all test points are wrong, the first test point state is taken as the first error,
            # otherwise it is partially correct
            if not error_test_case:
                self.submission.result = JudgeStatus.ACCEPTED
            elif self.problem.rule_type == ProblemRuleType.ACM or len(
                    error_test_case) == len(resp["data"]):
                self.submission.result = error_test_case[0]["result"]
            else:
                self.submission.result = JudgeStatus.PARTIALLY_ACCEPTED
        self.submission.save()

        if self.contest_id:
            if self.contest.status != ContestStatus.CONTEST_UNDERWAY or \
                    User.objects.get(id=self.submission.user_id).is_contest_admin(self.contest):
                logger.info("Contest debug mode, id: " + str(self.contest_id) +
                            ", submission id: " + self.submission.id)
                return
            with transaction.atomic():
                self.update_contest_problem_status()
                self.update_contest_rank()
        else:
            if self.last_result:
                self.update_problem_status_rejudge()
            else:
                self.update_problem_status()

        # At this point, the judgment is over, try to process the remaining tasks in the task queue
        process_pending_task()