Ejemplo n.º 1
0
        public void CheckSolution()
        {
            List <double> allCpuTime  = new List <double>();
            List <double> allMemUsage = new List <double>();

            Tasks task = _tournamentManager.Tasks
                         .Where(x => x.Id == taskId)
                         .FirstOrDefault();

            List <TasksTestData> testData = _tournamentManager.TasksTestData
                                            .Where(x => x.TaskId == taskId)
                                            .ToList();

            //Przygotowanie program managera to działania
            _programManager.Program       = program;
            _programManager.Language      = compilerType;
            _programManager.InputDataType = (InputDataType)task.InputDataTypeId;
            _programManager.MaxTime       = task.MaxExecuteTime;
            _programManager.MaxMemory     = task.MaxExecuteMemory;
            _programManager.JavaMainClass = JavaMainClass;

            //Działanie program managera
            try
            {
                //Kompilacja
                _programManager.Compile();

                if (_programManager.HasError) //w przypadku erroru - koniec działania
                {
                    _userManager.AddSolution(task.Id, task.TournamentId, task.PhaseId, userId, (int)compilerType, 0, program, task.MaxExecuteMemory, task.MaxExecuteTime, _programManager.ErrorInfo);
                    return;
                }

                foreach (var item in testData) // uruchamiamy i testujemy program
                {
                    _programManager.InputData = item.InputData;
                    _programManager.Execute();

                    if (!_programManager.HasError)
                    {
                        string output = BlankChars.Remove(_programManager.OutputData);
                        if (output == item.OutputData)
                        {
                            allCpuTime.Add(_programManager.ExecutedTime * 0.001); //zamieniamy ms na s
                            allMemUsage.Add(_programManager.MemoryUsed);
                        }
                        else
                        {
                            _userManager.AddSolution(task.Id, task.TournamentId, task.PhaseId, userId, (int)compilerType, 0, program, task.MaxExecuteMemory, task.MaxExecuteTime, _programManager.ErrorInfo);
                            return;
                        }
                    }
                    else
                    {
                        _userManager.AddSolution(task.Id, task.TournamentId, task.PhaseId, userId, (int)compilerType, 0, program, task.MaxExecuteMemory, task.MaxExecuteTime, _programManager.ErrorInfo);
                        return;
                    }
                }

                double avgCpuTime  = 0.0;
                double avgMemUsage = 0.0;

                allCpuTime.ForEach(x => avgCpuTime   += x);
                allMemUsage.ForEach(x => avgMemUsage += x);

                avgCpuTime  = avgCpuTime / allCpuTime.Count;
                avgMemUsage = avgMemUsage / allMemUsage.Count;

                _userManager.AddSolution(task.Id, task.TournamentId, task.PhaseId, userId, (int)compilerType, 5, program, avgMemUsage, avgCpuTime, _programManager.ErrorInfo);
            }
            catch
            {
                _userManager.AddSolution(task.Id, task.TournamentId, task.PhaseId, userId, (int)compilerType, 0, program, task.MaxExecuteMemory, task.MaxExecuteTime, _programManager.ErrorInfo);
            }

            this.Dispose();
        }