Beispiel #1
0
        /// <summary>
        /// 从Response中解析JudgeTask
        /// </summary>
        /// <param name="jsonStr"></param>
        /// <returns></returns>
        private JudgeContext[] ParseTask(string jsonStr)
        {
            JArray jArray = JArray.Parse(jsonStr);

            if (jArray.Count == 0)
            {
                return(new JudgeContext[0]);
            }

            JObject jObject = jArray[0] as JObject;

            if (!CheckTaskJObject(jObject))
            {
                return(new JudgeContext[0]);
            }

            SDNUOJTaskEntity taskEntity = jObject.ToObject <SDNUOJTaskEntity>();

            JudgeContext task = JudgeContextFactory.Create(
                int.Parse(taskEntity.SubmitId), int.Parse(taskEntity.ProblemId), taskEntity.DataVersion,
                taskEntity.Language.Substring(0, taskEntity.Language.Length - 2), taskEntity.SourceCode,
                taskEntity.Author, int.Parse(taskEntity.TimeLimit), int.Parse(taskEntity.MemoryLimit),
                false, false, bool.Parse(taskEntity.DbJudge));

            return(new[] { task });
        }
Beispiel #2
0
        /// <summary>
        /// 寻找评测目录下的SPJ程序
        /// </summary>
        /// <param name="context">评测上下文</param>
        /// <returns>SPJ程序路径</returns>
        public static string FindSpjProgramInJudger(JudgeContext context)
        {
            string compileDirectory = GetSpjDirectoryInJudger(context);

            string[] files = Directory.GetFiles(compileDirectory);

            if (files.Length > 2)
            {
                LogManager.Warning("Can not confirm the unique special judge program!");
            }

            string spjProgramPath = null;

            foreach (string file in files)
            {
                if (Path.GetFileName(file) == (context.LangConfig as ProgramLangConfig).SourceCodeFileName)
                {
                    continue;
                }

                spjProgramPath = file;
            }

            return(PathHelper.GetBaseAbsolutePath(spjProgramPath));
        }
Beispiel #3
0
        /// <summary>
        /// 取回测试数据
        /// 当Judger获得新任务,且本地不存在测试数据或数据过期时,会自动调用此方法拉取测试数据
        /// 测试数据应当打包在zip文件中并以二进制保存
        /// </summary>
        /// <param name="context">评测任务</param>
        /// <returns>测试数据</returns>
        public override byte[] Fetch(JudgeContext context)
        {
            string url         = Config.TestDataFetchUrl;
            string requestBody = CreateRequestBody(context.Task.ProblemId);

            return(HttpClient.UploadData(url, requestBody, 3));
        }
        private void Judge(JudgeContext context)
        {
            JudgeTask      task      = context.Task;
            ITaskSubmitter submitter = AdapterFactory.CreateTaskSubmitter();

            try
            {
                UpdateTestData(context);

                using (BaseJudger judger = JudgerFactory.Create(context))
                {
                    LogStartJudgeTask(task.SubmitId);
                    judger.Judge();
                }
            }
            catch (ExpectedJudgeStopException)
            { }
            catch (Exception ex) // 判题失败
            {
                context.Result = CreateFailedJudgeResult(context, ex.ToString());
                throw;
            }
            finally
            {
                LogJudgeResult(context.Result);
                submitter.Submit(context);
            }
        }
Beispiel #5
0
 public SingleCaseJudger(JudgeContext context, BaseDbOperator dbOperator)
 {
     JudgeContext   = context;
     JudgeTask      = context.Task;
     UserOperator   = dbOperator;
     _caseSensitive = (context.LangConfig as DbLangConfig).CaseSensitive;
 }
Beispiel #6
0
        /// <summary>
        /// 获取评测目录下的SPJ程序路径
        /// </summary>
        /// <param name="context">评测上下文</param>
        /// <returns>SPJ程序路径</returns>
        public static string GetSpjProgramPathInJudger(JudgeContext context)
        {
            string spjDirectory = GetSpjDirectoryInJudger(context);
            string path         = Path.Combine(spjDirectory, (context.LangConfig as ProgramLangConfig).ProgramFileName);

            return(PathHelper.GetBaseAbsolutePath(path));
        }
Beispiel #7
0
 public SpecialSingleCaseJudger(JudgeContext judgeContext, JudgeContext spjContext) : base(judgeContext)
 {
     SpjJudgeContext = spjContext;
     SpjTask         = spjContext.Task;
     SpjLangConfig   = spjContext.LangConfig as ProgramLangConfig;
     SpjLangConfig   = spjContext.LangConfig as ProgramLangConfig;
 }
        private void LogAddTask(JudgeContext context)
        {
            JudgeTask task = context.Task;

            LogManager.Info(
                $"New task: SubmitID:{task.SubmitId} Language:{task.Language} " +
                $"CodeLength:{task.SourceCode.Length} ProblemID:{task.ProblemId} Author:{task.Author}");
        }
Beispiel #9
0
 public SpecialJudger(JudgeContext context) : base(context)
 {
     JudgeTask.ProcessorAffinity = ProcessorAffinityManager.GetUsage();
     LangConfig    = context.LangConfig as ProgramLangConfig;
     SpjContext    = SpjManager.CreateSpjJudgeContext(context);
     SpjTask       = SpjContext.Task;
     SpjLangConfig = SpjContext.LangConfig as ProgramLangConfig;
 }
Beispiel #10
0
        private void LogAddTask(JudgeContext context)
        {
            JudgeTask task = context.Task;

            LogManager.Info(string.Format(
                                "New task: SubmitID:{0} Language:{1} CodeLength:{2} ProblemID:{3} Author:{4}",
                                task.SubmitId, task.Language, task.SourceCode.Length, task.ProblemId, task.Author));
        }
Beispiel #11
0
 public DbJudger(JudgeContext context) : base(context)
 {
     MainOperator = DbOperatorFactory.CreateMainOperatorByName(context.Task.Language);
     _dbName      = Path.GetFileName(context.TempDirectory).ToLower() + "db";
     _dbUser      = Path.GetFileName(context.TempDirectory).ToLower() + "user";
     _dbPassword  = Path.GetFileName(context.TempDirectory).ToLower() + "pwd";
     _dbType      = DbManager.GetDatabaseType(context.Task.Language);
 }
Beispiel #12
0
 public static BaseJudger Create(JudgeContext context)
 {
     return(context.Task.JudgeType switch
     {
         JudgeType.ProgramJudge => new ProgramJudger(context),
         JudgeType.SpecialJudge => new SpecialProgramJudger(context),
         JudgeType.DbJudge => new DbJudger(context),
         _ => throw new JudgeException("Unknown JudgeType!")
     });
Beispiel #13
0
        /// <summary>
        /// 获取评测目录下的SPJ目录
        /// </summary>
        /// <param name="context">评测上下文</param>
        /// <returns>SPJ目录</returns>
        public static string GetSpjDirectoryInJudger(JudgeContext context)
        {
            if (context.TempDirectory.EndsWith(SPJ_DIRECTORY))
            {
                return(context.TempDirectory);
            }

            return(Path.Combine(context.TempDirectory, SPJ_DIRECTORY));
        }
Beispiel #14
0
        /// <summary>
        /// 提交评测任务
        /// </summary>
        /// <param name="context">评测任务</param>
        /// <returns>提交是否成功</returns>
        public override bool Submit(JudgeContext context)
        {
            string         responseStr = HttpClient.UploadString(Config.ResultSubmitUrl, CreateRequestBody(context.Result), 3);
            ServerResponse response    = SampleJsonSerializer.DeSerialize <ServerResponse>(responseStr);

            if (response.Code == ResponseCode.Fail || response.Code == ResponseCode.WrongToken)
            {
                throw new FetcherException(context.Result.SubmitId + " submit failed: " + response.Message);
            }

            return(true);
        }
Beispiel #15
0
        public override void Submit(JudgeContext context)
        {
            string requestBody = CreateRequestBody(context.Result);
            string jsonResp    = HttpClient.UploadString(Config.ResultSubmitUrl, requestBody, 3);

            ServerResponse response = Json.DeSerialize <ServerResponse>(jsonResp);

            if (response.Code == ResponseCode.Fail || response.Code == ResponseCode.WrongToken)
            {
                throw new AdapterException(context.Result.SubmitId + " submit failed: " + response.Message);
            }
        }
        /// <summary>
        /// 创建Judger实例
        /// </summary>
        /// <param name="context">JudgeContext</param>
        /// <returns>Judger实例</returns>
        public static BaseJudger Create(JudgeContext context)
        {
            switch (context.Task.JudgeType)
            {
            case JudgeType.ProgramJudge: return(new ProgramJudger(context));

            case JudgeType.SpecialJudge: return(new SpecialJudger(context));

            case JudgeType.DbJudge: return(new DbJudger(context));

            default: throw new JudgeException("Unknown JudgeType!");
            }
        }
 private JudgeResult CreateFailedJudgeResult(JudgeContext context, string message = "")
 {
     return(new JudgeResult
     {
         Author = context.Task.Author,
         JudgeDetail = message,
         MemoryCost = 0,
         TimeCost = 0,
         PassRate = 0,
         ProblemId = context.Task.ProblemId,
         SubmitId = context.Task.SubmitId,
         ResultCode = JudgeResultCode.JudgeFailed
     });
 }
Beispiel #18
0
        private JudgeContext CreateJudgeContext(string submitId)
        {
            GetSolutionInfo(submitId, out string problemId, out string author, out string lang);
            GetProblemInfo(problemId, out int timeLimit, out int memoryLimit, out bool spj);
            string sourceCode = GetSolutionSourceCode(submitId);
            string dataMd5    = GetTestDataMd5(problemId);

            JudgeContext context = JudgeContextFactory.Create(
                submitId, problemId, dataMd5, lang, sourceCode,
                author, timeLimit, memoryLimit, false, spj);

            UpdateSolution(submitId, 3, 0, 0, 0.0);

            return(context);
        }
        private void UpdateTestData(JudgeContext context)
        {
            JudgeTask task = context.Task;

            // 检查本地测试数据是否为最新
            if (!TestDataManager.CheckDataVersion(task.ProblemId, task.DataVersion))
            {
                LogInvalidTestData(task.ProblemId);

                ITestDataFetcher fetcher = AdapterFactory.CreateTestDataFetcher();
                TestDataManager.WriteTestData(task.ProblemId, fetcher.Fetch(context));

                LogTestDataFetched(task.ProblemId);
            }
        }
Beispiel #20
0
 public override object VisitJudge([NotNull] JudgeContext context)
 {
     if (context.op.Text == "~=")
     {
         return("!=");
     }
     else if (context.op.Text == "&")
     {
         return("&&");
     }
     else if (context.op.Text == "|")
     {
         return("||");
     }
     return(context.op.Text);
 }
Beispiel #21
0
        /// <summary>
        /// 根据SubmitID获取JudgeTask
        /// </summary>
        private JudgeContext GetJudgeTask(string submitId)
        {
            GetSolutionInfo(submitId, out string problemId, out string author, out string lang);
            string sourceCode = GetSolution(submitId);

            GetProblemInfo(problemId, out int timeLimit, out int memoryLimit, out bool spj);
            string dateMd5 = GetTestDataMd5(problemId);

            JudgeContext task = JudgeContextFactory.Create(
                submitId, problemId, dateMd5, lang, sourceCode,
                author, timeLimit, memoryLimit, false, spj);

            Authenticator.Instance.UpdateSolution(submitId, 3, 0, 0, 0.0);

            return(task);
        }
        /// <summary>
        /// 开始评测JudgeTask
        /// </summary>
        /// <param name="judgeTaskObject">JudgeTask对象</param>
        private void RunJudgeTask(object judgeTaskObject)
        {
            JudgeContext context = judgeTaskObject as JudgeContext;

            try
            {
                Judge(context);
            }
            catch (Exception ex)
            {
                LogException(ex);
            }

            lock (_queueLock)
                RunningCount--;

            //重新检查是否有任务
            CheckTask();
        }
        private void RunJudgeTask(object contextObject)
        {
            JudgeContext context = contextObject as JudgeContext;

            try
            {
                Judge(context);
            }
            catch (Exception ex)
            {
                LogException(ex);
            }

            lock (_checkRunLock)
            {
                RunningCount--;
            }

            //重新检查是否有任务
            CheckRunTask();
        }
Beispiel #24
0
        /// <summary>
        /// 创建SPJ的JudgeContext, 用于编译运行SPJ程序
        /// </summary>
        /// <param name="originContext">源评测任务</param>
        /// <returns>SPJ的JudgeTask</returns>
        public static JudgeContext CreateSpjJudgeContext(JudgeContext originContext)
        {
            JudgeContext newContext = originContext.Clone() as JudgeContext;

            string spjSourceFilePath = FindSpjSourceFileInTestData(newContext.Task.ProblemId);

            if (spjSourceFilePath == null) //没有SPJ程序源代码, 无法评测
            {
                throw new JudgeException("No special judge program exception!");
            }

            newContext.Task.SourceCode = File.ReadAllText(spjSourceFilePath);

            newContext.LangConfig = GetLangConfigBySourceFilePath(spjSourceFilePath);
            ProgramLangConfig langConfig = newContext.LangConfig as ProgramLangConfig;

            newContext.Task.Language = newContext.LangConfig.Name;

            string spjDir = GetSpjDirectoryInJudger(originContext) + "\\";
            string appDir = PathHelper.GetBaseAbsolutePath("");

            // 替换<tempdir>和<appdir>字段
            langConfig.CompilerPath          = langConfig.CompilerPath.Replace("<tempdir>", spjDir).Replace("<appdir>", appDir);
            langConfig.CompilerWorkDirectory = langConfig.CompilerWorkDirectory.Replace("<tempdir>", spjDir)
                                               .Replace("<appdir>", appDir);
            langConfig.CompilerArgs        = langConfig.CompilerArgs.Replace("<tempdir>", spjDir).Replace("<appdir>", appDir);
            langConfig.RunnerPath          = langConfig.RunnerPath.Replace("<tempdir>", spjDir).Replace("<appdir>", appDir);
            langConfig.RunnerWorkDirectory = langConfig.RunnerWorkDirectory.Replace("<tempdir>", spjDir)
                                             .Replace("<appdir>", appDir);
            langConfig.RunnerArgs = langConfig.RunnerArgs.Replace("<tempdir>", spjDir).Replace("<appdir>", appDir);

            newContext.TempDirectory = spjDir;

            if (!Directory.Exists(spjDir))
            {
                Directory.CreateDirectory(spjDir);
            }

            return(newContext);
        }
Beispiel #25
0
        /// <summary>
        /// 从Response中解析Task
        /// </summary>
        /// <param name="data">来自服务器的JObject任务数组</param>
        /// <returns>JudgeContexts</returns>
        private JudgeContext[] CreateTaskContexts(JToken data)
        {
            InnerJudgeTask[] innerJudgeTasks = data.ToObject <InnerJudgeTask[]>();

            if (innerJudgeTasks == null || innerJudgeTasks.Length == 0)
            {
                return(new JudgeContext[0]);
            }

            List <JudgeContext> judgeTasks = new List <JudgeContext>();

            foreach (var item in innerJudgeTasks)
            {
                JudgeContext task = JudgeContextFactory.Create(
                    item.SubmitId, item.ProblemId, item.DataVersion,
                    item.Language, item.SourceCode, item.Author,
                    item.TimeLimit, item.MemoryLimit,
                    item.JudgeAllCases, item.JudgeType);

                judgeTasks.Add(task);
            }

            return(judgeTasks.ToArray());
        }
Beispiel #26
0
        private JudgeContext[] CreateJudgeContexts(string jsonResp)
        {
            JArray taskJArray = JArray.Parse(jsonResp);

            if (taskJArray.Count == 0 || !(taskJArray[0] is JObject))
            {
                return(new JudgeContext[0]);
            }

            SdnuojJudgeTask task = taskJArray[0].ToObject <SdnuojJudgeTask>();

            if (task == null)
            {
                return(new JudgeContext[0]);
            }

            JudgeContext context = JudgeContextFactory.Create(
                task.SubmitId, task.ProblemId, task.DataVersion,
                task.Language.Substring(0, task.Language.Length - 2), task.SourceCode,
                task.Author, int.Parse(task.TimeLimit), int.Parse(task.MemoryLimit),
                false, false, bool.Parse(task.DbJudge));

            return(new[] { context });
        }
 public override byte[] Fetch(JudgeContext context)
 {
     return(Fetch(context.Task.ProblemId));
 }
 /// <summary>
 /// 添加评测任务(上下文)
 /// </summary>
 /// 请使用Judger.Adapter.JudgeContextFactory创建评测上下文
 public void AddTask(JudgeContext context)
 {
     LogAddTask(context);
     _judgeQueue.Enqueue(context);
     CheckRunTask();
 }
Beispiel #29
0
 public override bool Submit(JudgeContext context)
 {
     HttpClient.CookieContainer = Authenticator.Instance.CookieContainer;
     HttpClient.UploadString(Config.ResultSubmitUrl, CreateResultBody(context.Result), 3);
     return(true);
 }
Beispiel #30
0
 /// <summary>
 /// 获取评测目录下的SPJ程序的源文件路径
 /// </summary>
 /// <param name="context">评测上下文</param>
 /// <returns>SPJ源文件名</returns>
 public static string GetSpjSourceFileInJudger(JudgeContext context)
 {
     return(Path.Combine(
                GetSpjDirectoryInJudger(context),
                (context.LangConfig as ProgramLangConfig).SourceCodeFileName));
 }