Exemple #1
0
        public ProcessItem(
            ILogger <ProcessItem> logger, CourseService courseService, LanguageService languageService,
            IdService idService, AppOptions appOptions, IHubContext <LiveHub> liveHub,
            CompareService compareService, MatlabServer matlabServer, EvaluationService evaluationService,
            CcData item)
        {
            _logger            = logger;
            _courseService     = courseService;
            _languageService   = languageService;
            _liveHub           = liveHub;
            _idService         = idService;
            _appOptions        = appOptions;
            _compareService    = compareService;
            _matlabServer      = matlabServer;
            _evaluationService = evaluationService;

            Item    = item;
            Context = new CourseContext(
                _courseService,
                _languageService,
                Item
                );

            _matlabServer.Initialize(ProcessService.ContainerName);

            var timeout = Context.CourseProblem.Timeout < 1 ? DefaultTimeoutPerCase : Context.CourseProblem.Timeout;

            TimeBank = new TimeBank(
                Context.Language,
                Item.Action == "input" ? IncreaseTimeoutForInput(timeout) : timeout
                );
            Item.Result.TimeLimit = TimeBank.TimeLeft;
        }
Exemple #2
0
        private async Task <ExecutionResult> SolveCaseBaseAsync(CourseProblemCase @case)
        {
            var caseId  = @case.Id;
            var subcase = Item.Results.First(i => i.Case == caseId);

            // skip global timeouts
            if (TimeBank.IsBusted())
            {
                subcase.SetStatus(ProcessStatus.Skipped);
                subcase.TimeLimit = 0;
                subcase.Messages  = new[] { "No time left" };
                return(new ExecutionResult
                {
                    Code = ExecutionStatus.GlobalTimeout,
                    Status = ExecutionStatus.GlobalTimeout.ToString(),
                    Duration = 0,
                    ReturnCode = -1,
                });
            }

            // copy test assets
            CopyInDocker($"assets/{caseId}/*");

            subcase.Status    = ProcessStatus.Running.Value;
            subcase.TimeLimit = @case.Timeout.ScaleTo(Context.Language);

            var language   = Context.Language;
            var isUnitTest = Context.CourseProblem.Type == ProblemType.Unittest;
            var pipeline   = isUnitTest && language.Unittest.Any()
                ? language.Unittest
                : language.Run;


            SetPermissions();
            var executionResult = ExecuteCommand(new ExecutionCommand
            {
                Command  = $"{string.Join(" ", pipeline)}".ReplaceCommon(Context.MainFileName),
                Workdir  = Context.DockerTmpWorkdir,
                Timeout  = @case.Timeout.ScaleTo(language),
                Deadline = TimeBank.TimeLeft,
                IPath    = isUnitTest ? null : $"input/{@case.Id}",
                OPath    = $"output/{@case.Id}",
                EPath    = $"error/{@case.Id}"
            });


            CopyOutputFromDocker(@case);
            CopyErrorFromDocker(@case);
            CopyFromDocker(".report.json");
            CopyFromDocker(".report.simple.json");
            foreach (var f in Context.CourseProblem.Export)
            {
                CopyFromDocker(f);
            }

            // determine messages and statuses
            _evaluationService.EvaluateTypeSolve(executionResult, this, @case);
            return(executionResult);
        }
        public IEnumerable <string> CreateDeadlineMessages(TimeBank bank)
        {
            yield return("Solution ran out of global time!");

            yield return($"Allowed global walltime  : {bank.LanguageDeadline:0.000}");

            yield return($"Solution global walltime : {bank.WallTime:0.000}");

            yield return($"Global baseline timeout  : {bank.Deadline:0.000}");

            yield return($"Language compensation    : [{bank.Language.ScaleInfo}] for {bank.Language.Name}");
        }
        private async Task GenerateInputAction(CourseProblemCase @case)
        {
            var subcase = Item.Results.First(i => i.Case == @case.Id);

            if ([email protected]())
            {
                subcase.Status    = ProcessStatus.Skipped.Value;
                subcase.Message   = "Skipping static input file";
                subcase.TimeLimit = 0;
                return;
            }

            // skip global timeouts
            if (TimeBank.IsBusted())
            {
                subcase.SetStatus(ProcessStatus.Skipped);
                subcase.Messages  = new[] { "No time left" };
                subcase.TimeLimit = 0;
                return;
            }

            subcase.Status    = ProcessStatus.Running.Value;
            subcase.TimeLimit = @case.Timeout.ScaleTo(Context.Language);

            var baseCommand    = $"{string.Join(" ", Context.Language.Run)}".ReplaceCommon(Context.MainFileName);
            var fullCommand    = $"{baseCommand} {@case.GetArguments()}";
            var generateResult = ExecuteCommand(new ExecutionCommand
            {
                Command  = fullCommand,
                Workdir  = Context.DockerTmpWorkdir,
                Timeout  = @case.Timeout.ScaleTo(Context.Language),
                Deadline = TimeBank.TimeLeft,
                OPath    = $"output/{@case.Id}",
                EPath    = $"error/{@case.Id}",
            });

            CopyOutputFromDocker(@case);
            CopyErrorFromDocker(@case);
            CopyToResultDir(Context.TmpDir.OutputDir, Context.ProblemDir.InputDir, false);

            _evaluationService.EvaluateTypeGenerate(generateResult, this, @case);
        }